LoginSignup
1
6

More than 3 years have passed since last update.

https通信であることをALBを利用した環境でhttpdに分からせる方法

Last updated at Posted at 2019-09-05

ALBを使ってバランシングをする

クライアントのリクエストは一旦ALBで引き受けて、その後はALBにwebサーバーとのやり取りを任せます。この時ALBに元々付いている無料SSLの設定をしており、webサーバー側にはhttps接続のために Apache HTTP Server の mod_sslを利用しているので、httpsでの接続が必須になります。しかし、ALBとwebサーバーのやり取りは、httpで行われるという制約があります。ではどうしようか・・・

解決策

クライアント側のhttpsリクエストをwebサーバー側で検知させる

必要なディレクティブ

リクエストのある側面が指定された正規表現 に合うかどうかによって環境変数を設定する機能のApacheモジュールmod_setenvifを使用して使えるようになるディレクティブです。

リクエストの属性に基づいて環境変数を設定する

このディレクティブに使える引数は、

1.HTTP リクエストヘッダフィールド

2.以下のリクエストの一部分のどれか:
 Remote_Host - リクエストを行なっているクライアントのホスト名 (もしあれば)
 Remote_Addr - リクエストを行なっているクライアントの IP アドレス
 Server_Addr - リクエストを受け取ったサーバの IP アドレス (2.0.43 以降のみ)
 Request_Method - 使用されているメソッド名 (GET, POST など)
 Request_Protocol - リクエストが行なわれたプロトコルの名前とバージョン (例えば、"HTTP/0.9", "HTTP/1.1" など。)
 Request_URI - URL のスキームとホストの後の部分

3.リクエストと関連付けられる環境変数のリスト。

必要なヘッダー

  • X-Forwarded-Proto

X-Forwarded-Proto (XFP) ヘッダーは、プロキシまたはロードバランサーへ接続するのに使っていたクライアントのプロトコル (HTTP または HTTPS) を特定するために事実上の標準となっているヘッダーです。

この2つを用いて、検知させる仕組みを作ります。自分でも作業しててたった1行でできたので、驚いたものです。

実際にconfに書いたもの

SetEnvIf X-Forwarded-Proto ^https$ HTTPS=on

になります。リクエストヘッダにX-Forwarded-Protoを使い、正規表現にはhttpsが引っかかるようにして、関連づけられる環境変数はHTTPS=onです。

1
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6