ロードバランサーの背後でngnixを使用してhttpをhttpsに書き換えます


13

管理パネル内でsslキー/ pemを設定できるRackspaceロードバランサーを使用しています。すべて正常に動作し、httpとhttpsの両方のプロトコルを使用できます。しかし、私が使用してhttpをhttpsにリダイレクトしようとすると:

server{
  listen *:80;
  server_name mydomain.com www.mydomain.com; 
  rewrite ^ https://mydomain.com$request_uri? permanent;

...リダイレクトループが発生します。私はポート443をリッスンしていないことに気づきましたが、それはロードバランサーが処理してくれたためです。また、書き直しをif ($scheme ~* http){無効にしてみました。

私の質問の他の部分は、URLからwwwを削除したいということです。これを1回の書き換えで実行できますか?上記のリライトもこれを処理するべきではありませんか?

ご協力いただきありがとうございます!


ロードバランサーは、接続がHTTPSであったかどうかの指示を送信しているはずです。Rackspaceにお問い合わせください。(ああ、あなたはおそらくwwwを取り除きたくないでしょう...)
マイケル・ハンプトン

興味深いことに、私はそれを調べます。なぜ私はwwwを排除すべきではないと思いますか?
jwerre 2013

回答:


14

sciurusは、SSLがロードバランサーでオフロードされるときに、RackspaceのCloud Load BalancerがX-Forwarded-Protoをhttpsに設定するという点で正しいです。nginxでリダイレクトループを回避するにlocationは、vhost構成のセクションに以下を追加できる必要があります。

if ($http_x_forwarded_proto = "http") {
            rewrite  ^/(.*)$  https://mydomain.com/$1 permanent;
}

これにより、https以外のリクエストをhttpsにリダイレクトする際の無限リダイレクトループが回避されます。


18

nginxのを使って、サーバー変数を内蔵だ$request_uri$server_name、あなたはすべての正規表現を使用せずにこれを行うことができます。以下をサーバーのlocationブロックに追加すれば完了です。

if ($http_x_forwarded_proto = "http") {
    return 301 https://$server_name$request_uri;
}

これは、ロードバランサーが$http_x_forwarded_protoリクエストとともにヘッダーをバックエンドインスタンスに送信していることを前提としています。その他の一般的なヘッダーには、$http_x_forwarded_schemeおよびも含まれます$scheme

詳細については、nginxの落とし穴とよくある間違いのドキュメントをご覧ください。https//www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites


5
間違いなくreturn over rewriteを使用してください。賛成。
DesignerMonkey

1
$host代わりに使用できます$server_name
Yossi

server_name _では機能しません。したがって、@ Yossiが示唆するように$ host変数を使用する必要があります。
Razvan Grigore

1

ロードバランサーは常にhttp経由で通信します。何が起こっているのですか

  1. ブラウザはロードバランサのポート80にリクエストを送信します
  2. ロードバランサーがWebサーバーのポート80にリクエストを送信します
  3. Webサーバーがユーザーにリダイレクトを送信する
  4. ユーザーがロードバランサーのポート443にリクエストを送信する

手順2〜4は、ブラウザがリダイレクトループを検出して中止するまで繰り返されます。

編集:これを解決するには、X-Forwarded-Protoヘッダーがhttpに設定されている場合にのみ書き換えを実行します。このヘッダーは、Rackspaceのロードバランサーがリクエストを受信したプロトコルをWebサーバーに通知する方法です。


$ server_protocolが常にHTTPを返す理由はこれで説明できると思います
jwerre

なぜあなたはこれが起こっているのかと答えました...修正方法に関する提案はありますか?
jwerre 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.