はじめに
ELB上でSSL証明書の設定をしている状態で、http(80)で来たアクセスをhttps(443)に転送したい話しです。
困った事
httpsでサービスを展開したいので、httpアクセスはhttpsにリダイレクトしようと思って、こちらを参考にNginxのconfに return 301 https://$host$request_uri;
を書いてみました。
しかし、ELBで443を80に転送される設定がある状態でこれを書くと、当たり前の話しですがリダイレクトループが発生します。
状況として
①80で待ってるNginxにアクセスが来る
②return
の設定に従ってhttps(443)に転送 (つまりELBに戻る)
③また①に戻る
これが繰り返されます
やった事
ELBでリダイレクトされるとX-Forwarded-Proto
というヘッダーを持ってNginxに到達します。
例
X-Forwarded-Proto: https
詳細はこちら↓
Elastic Load Balancing の X-Forwarded ヘッダーの詳細
これを使ってhttpかhttpsか?を判断して、httpの時だけリダイレクトするようにしました。
server {
listen *:80;
server_name aaa.com;
root /var/www/;
index index.php index.html;
# ここの部分で判定!!
if ($http_x_forwarded_proto != https) {
return 301 https://$host$request_uri;
}
}