web-dev-qa-db-ja.com

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

管理パネル内で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回の書き換えで実行できますか?上記のリライトもこれを処理する必要はありませんか?

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

13
jwerre

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

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

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

14
slade

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

18
Luke Peterson

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

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

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

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

1
sciurus