Avani 씨가
로드 밸런서와 Apache를 사용하여
HTTPS로 HTTP 트래픽을 리디렉션하는 방법을 안내합니다.

redirect-http-https-elb-avani

저는 Elastic Load Balancing(ELB)을 사용하고 있으며 Classic Load Balancer에 HTTP 리스너와 HTTPS 리스너가 둘 다 있습니다. 웹 서버에 리디렉션 로직을 추가하면 웹 사이트가 작동을 멈추고 ERR_TOO_MANY_REDIRECTS 오류가 표시됩니다. 로드 밸런서가 SSL을 오프로드하고 백엔드가 단일 HTTP 포트에서만 수신합니다. 로드 밸런서를 통해 포트 80에서 웹 서버에 들어오는 모든 트래픽이 HTTPS 포트 443으로 리디렉션되고, 백엔드 리스너가 포트 443으로 변경되면 좋겠습니다. 이 문제는 어떻게 해결합니까?

Classic Load Balancer를 사용하는 경우 로드 밸런서 수준에서 HTTP 트래픽을 HTTPS로 리디렉션할 수 없습니다. 대신에 로드 밸런서 뒤의 웹 서버에서 리디렉션 로직을 구현하십시오.

그러면 로드 밸런서와 백엔드 웹 서버 사이에 리디렉션 무한 루프가 생깁니다.

  1. HTTP 요청을 HTTPS로 보내기 위한 웹 서버의 다시 쓰기 규칙에 따라 로드 밸런서의 HTTPS 트래픽용 포트 443이 요청에 사용됩니다.
  2. 로드 밸런서는 포트 80의 백엔드 웹 서버로 계속 요청을 보냅니다.
  3. 백엔드 웹 서버는 로드 밸런서의 포트 443으로 요청을 리디렉션합니다.

ERR_TOO_MANY_REDIRECTS 오류가 반환되고 요청이 수행되지 않습니다.

이 문제를 해결하려면 HTTP 요청의 X-Forwarded-Proto 헤더를 사용하여 클라이언트 프로토콜이 HTTP인 경우에만 적용되도록 웹 서버의 다시 쓰기 규칙을 변경하십시오. 클라이언트에 사용된 다른 모든 프로토콜의 다시 쓰기 규칙은 무시하십시오.

참고: Application Load Balancer를 사용하는 경우 리디렉션 작업 을 사용하여 트래픽을 대신 리디렉션하십시오.

Apache, NGINX, IIS 웹 서버에 대한 다음 예에서는 아래의 작업을 수행하십시오.

  • 클라이언트가 HTTP를 사용하여 웹 사이트에 액세스하면 HTTPS URL로 리디렉션됩니다.
  • 클라이언트가 HTTPS를 사용하여 웹 사이트에 액세스하면 웹 서버에서 직접 서비스합니다.

Apache 서버: 가상 호스트 파일 메서드(권장)

구성 파일의 가상 호스트 섹션에 다시 쓰기 규칙을 포함합니다. 예를 들어 Apache httpd 서버를 사용할 경우 /etc/httpd/conf/httpd.conf 파일을 편집하고 Apache 2.4의 경우 /etc/apache2/sites-enabled/ 폴더의 .conf 파일을 편집하십시오.

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>

Apache 서버: .htaccess 파일 메서드(권장 안 함)

경고: htaccess를 사용하지 않는 것이 좋으며 기본 구성 파일에 액세스할 수 없는 경우에만 이 파일을 사용해야 합니다. Apache HTTP 서버 자습서: .htaccess 파일을 참조하십시오.

1. 디렉터리 명령에서 Apache 구성 파일의 .htaccess를 활성화합니다. 예를 들어 Apache httpd 서버를 사용하는 경우 /etc/httpd/conf/httpd.conf 파일을 편집하십시오. Apache 2.4의 경우 /etc/apache2/sites-enabled/ 폴더의 conf 파일을 편집하십시오. Apache HTTP 서버 자습서: .htaccess 파일을 참조하십시오.

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

2. .htaccess 파일에 다음과 같은 다시 쓰기 규칙을 추가합니다.

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

NGINX 서버

참고: nginx/1.10.3(Ubuntu) 및 nginx/1.12.1(Amazon Linux)에 적용됩니다.

다음의 다시 쓰기 규칙 예제를 수정하십시오(nginx.conf).

server {
    listen 80;
    server_name _;
    if ($http_x_forwarded_proto = 'http'){
    return 301 https://$host$request_uri;
    }
}

[IIS servers]

참고: Microsoft Windows Server 2012 R2 및 2016 Base에만 적용됩니다.

1. Microsoft IIS 다운로드에서 URL 다시 쓰기 모듈을 설치합니다.

2. web.config<system.webServer> 섹션에서 IIS 백엔드의 다음과 같은 다시 쓰기 규칙 예제를 수정하십시오.

<rewrite>
    <rules>
        <rule name="Rewrite HTTP to HTTPS" stopProcessing="true">
            <match url="^(.*)$"/>
            <conditions logicalGrouping="MatchAny">
                <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$"/>
            </conditions>
            <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}"/>
        </rule>
    </rules>
</rewrite>

3. IIS 관리자를 열고 기본 웹 사이트를 새로 고칩니다. URL 다시 쓰기 섹션에 규칙이 표시되어야 합니다.

4. 웹 사이트를 다시 시작하고 리디렉션 작업을 확인합니다.


페이지 내용이 도움이 되었습니까? | 아니요

AWS 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시 날짜: 2016-08-12

업데이트됨: 2018-08-31