質問: AWS の ELB の背後に EC2 の Web サーバ(httpd は apache2)を配置しています。 クライアント <-> ELB は http もしくは https でのアクセス、ELB <-> EC2 (apache) は http で接続するようにしています(よくあるパターンだと思います)。 ここで質問なのですが、ドキュメントルートに hoge ディレクトリがあり、クライアント側から https:///hoge という URL でアクセスしたときと https:///hoge/ と最後に / を付けてアクセスした時で挙動が変わります。 https:///hoge の場合、EC2 上の apache2 はクライアントに 301 を返して http:///hoge/ へリダイレクトさせようとして、それ以降は http でのアクセスになってしまいます。 クライアント側で確実に最後に / を付けるようにという運用は難しいのですが、なにか解決方法は無いでしょうか?
回答: ELB が付けるヘッダ X-Forwarded-Port を使って Apache2 側でリダイレクトをかけるしか無いようです。 注意しなければならないのは、ヘルスチェックにリダイレクトを返却するとエラーになることとのこと。 > > RewriteEngine On > > > RewriteCond %{HTTP:X-Forwarded-Port} !^443$ > > RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker > > RewriteRule ^(.*)?$ https://%{HTTP_HOST}$1 [R=301,L] > > > ELB への接続がポート番号 443(https)ではない場合、かつ、ヘルスチェックのアクセスではない場合、https にリダイレクトさせるということになります。 実際のところ、自分で「http:///hoge/」にアクセスしろと言っておいて、再度「https:///hoge/」にリダイレクトさせるって気持ち悪いですが。