AWS ELB + Nginx/Apache/IIS で httpをHTTPSにリダイレクト

AWS CloudfrontでHTTPをHTTPSにリダイレクトしていたが、一部のコンテンツが表示されなかったりと、影響が大きかった。

ただSSL化はしたかったので、AWS ELBでSSL化を行うことにした。

CloudFrontではHTTPSにリダイレクトするのは超簡単だったのだが、ELBにはその機能がない。

その代わりELBにはX-FORWARDED-PROTOがサポートされているため、X-FORWARDED-PROTOにHTTPSがなければ、301でHTTPSにリダイレクトさせる

目次

Nginx

server {
    listen 80;
        #....
        
        #ここを追加
    if ($http_x_forwarded_proto != https) {
      return 301 https://$host$request_uri;
    }
}

もしくは

server {
    listen 80;
    #....

    location / {
            #ここを追加
        if ($http_x_forwarded_proto != 'https') {
            return 301 https://$server_name$request_uri;
        }

    #....
    }
}

Apache

<VirtualHost *:80>
 #...
 RewriteEngine On
 RewriteCond %{HTTP:X-Forwarded-Proto} !https
 RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [NE]
 #...
</VirtualHost>

IIS

<rewrite xdt:Transform="Insert">
 <rules>
 <rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
 <match url="^(.*)$" ignoreCase="false" />
 <conditions>
 <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
 </conditions>
 <action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
 </rule>
 </rules>
</rewrite>

ヘルスチェック用設定

ELBのヘルスチェックが80番の場合は以下のようにヘルスチェック用ページだけリダイレクトしないようにする必要がある

server {
    listen 80 default_server;
    server_name "";
    location /health {
        access_log off;
        return  200;
    }
}
server {
    listen 80;
    server_name app.yourdomain.com;
    #....
    location / {
        if ($http_x_forwarded_proto != 'https') {
            return 301 https://$server_name$request_uri;
        }
        try_files $uri $uri/ /index.php?$args;
    }
    #....
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です