MOテクノロジー

技術をメモしていくブログ

X-Forwarded-Protoを学んだ

クライアント --> ALB --> EC2(nginx)という構成のサービスの話。
ALBでは80,443で受けたリクエストを全て80でEC2に送信している。
このとき、同期からnginxの設定で80できたリクエストは443にリダイレクトするから、無限ループになっちゃわない?と質問された。確かに感。虚を突かれた感。
ということで調べてみた。

X-Forwarded-Protoとは

ここに全て書いてあった。
HTTP ヘッダーおよび クラシックロードバランサー - Elastic Load Balancing

クライアントがロードバランサーへの接続に使用したプロトコル (HTTP または HTTPS) を識別することができます。
次の例には、HTTPS リクエストとしてクライアントから発信されたリクエストの X-Forwarded-Proto リクエストヘッダーが含まれています。
X-Forwarded-Proto: https

つまりX-Forwarded-Protoを見ればクライアント --> ALBで使われたプロトコルがわかるので、そこがhttpかhttpsなのか、でリダイレクトされるかされないかを判別している。
例えば下のコードだと、https以外で来たリクエストはhttpsにリダイレクトするが、httpsできたリクエストはリダイレクトされないといった仕組み。

    if ($http_x_forwarded_proto != https) {
        return 301 https://$host$request_uri;
    }

参考

ELB を使用して HTTP トラフィックを HTTPS にリダイレクトする