web-dev-qa-db-ja.com

元のリクエストがhttps経由で行われたときのロケーションヘッダーのhttp

現在、本番環境に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が残りを行います。

スタックは少し異なりますが、テスト環境で問題を再現できます。

私の質問:

  1. ブラウザからの元のリクエストがhttpで行われたときに、Location-ヘッダーのスキームとしてhttpsを取得するのはなぜですか?
  2. これはApachemod_rewrite/mod_proxyまたはnginxの問題ですか?
  3. これはTomcatの問題ですか?
4
pkhamre

Apacheに到達するリクエストはHTTPであるため、レスポンスヘッダーにhttpが含まれます。SSLはロードバランサーで削除されています。つまり、Apacheが見るところ、それは単なるHTTPリクエストです。

設定することでこれを回避できます

ServerName https://www.example.org

グローバルまたは仮想ホスト構成で。これにより、デフォルトのhttpスキームが上書きされるため、Apacheは必要な応答を送信します。 ServerName のドキュメントにこれが記載されています。

4
Andrew Schulman

同様の問題がありました。仮想ホスト構成に以下を追加すると、問題が解決するはずです。基本的には、httpリクエストをhttpsに編集します

Header edit Location ^http://(.*)$ https://$1

4
user3664441

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/;
1
cnst