管理パネル内で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回の書き換えで実行できますか?上記のリライトもこれを処理する必要はありませんか?
ご協力いただきありがとうございます!
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にリダイレクトする際の無限リダイレクトループを回避できます。
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
ロードバランサーは常にhttp経由で通信します。何が起こっているのですか
手順2〜4は、ブラウザがリダイレクトループを検出して中止するまで繰り返されます。
編集:これを解決するには、X-Forwarded-Protoヘッダーがhttpに設定されている場合にのみ書き換えを実行します。そのヘッダーは、RackspaceのロードバランサーがWebサーバーに、リクエストの受信に使用したプロトコルを通知する方法です。