現在、本番環境にhttps
を実装していますが、ここで少し頭を悩ませています。
SSLはロードバランサーで終了し、スタック内のフローは基本的に次のようになります。
Production:ブラウザ<-https
->ロードバランサー<-http
-> Apache <-http
->ロードバランサー<-http
-> Tomcat
テスト:ブラウザ<-https
-> nginx <-http
->ロードバランサー<-http
-> Tomcat
HTTPS経由でログインページにアクセスすると、次のようになります。
リクエストヘッダー
POST /login/form HTTP/1.1
Host: www.example.org
Connection: keep-alive
Content-Length: 74
Cache-Control: max-age=0
Origin: https://www.example.org
Content-Type: application/x-www-form-urlencoded
Referer: https://www.example.org/login
Accept-Encoding: gzip,deflate,sdch
Accept-Language: nb,en-US;q=0.8,en;q=0.6
応答ヘッダー
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Fri, 17 Jan 2014 11:16:50 GMT
Content-Length: 0
Connection: keep-alive
Set-Cookie: FOO=example
Location: http://www.example.org/portal
Strict-Transport-Security: max-age=31536000
私は開発者と話をしました、そして彼は私に次のように言いました:
コードにはrequest.sendRedirect( "/ portal")のようなsthがあり、Tomcatが残りを行います。
スタックは少し異なりますが、テスト環境で問題を再現できます。
私の質問:
http
で行われたときに、Location
-ヘッダーのスキームとしてhttps
を取得するのはなぜですか?Apacheに到達するリクエストはHTTPであるため、レスポンスヘッダーにhttpが含まれます。SSLはロードバランサーで削除されています。つまり、Apacheが見るところ、それは単なるHTTPリクエストです。
設定することでこれを回避できます
ServerName https://www.example.org
グローバルまたは仮想ホスト構成で。これにより、デフォルトのhttpスキームが上書きされるため、Apacheは必要な応答を送信します。 ServerName のドキュメントにこれが記載されています。
同様の問題がありました。仮想ホスト構成に以下を追加すると、問題が解決するはずです。基本的には、httpリクエストをhttpsに編集します
Header edit Location ^http://(.*)$ https://$1
http://nginx.org/docs/http/ngx_http_proxy_module.html#proxy_redirect
proxy_redirect default;
proxy_redirect http://www.example.org/ https://www.example.org/;