ワイルドカードサブドメインをhttps(nginx)にリダイレクトする


20

ワイルドカードSSL証明書を取得しており、SSL以外のすべてのトラフィックをSSLにリダイレクトしようとしています。現在、私は正常に動作しているサブドメイン化されていないURLのリダイレクトに以下を使用しています。

server {
listen      80;
server_name mydomain.com;

#Rewrite all nonssl requests to ssl.
rewrite     ^ https://$server_name$request_uri? permanent;
}

* .mydomain.comで同じことをすると、論理的にリダイレクトされます

https://%2A.mydomain.com/

すべてのサブドメインを同等のhttpsにリダイレクトするにはどうすればよいですか?


2
$ server_nameの代わりに、なぜ$ hostでないのですか?
cjc

回答:


47

それで全部です...

server {
    listen      80;
    server_name *.mydomain.com;

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}

2
もう少し説明すると、これがより良い答えになるかもしれません。
デイブM

3
@ dave-m、説明が必要だと?$host変数?$request_uri
カドミ

それは動作しませんが、まだhttps://%2A.handy.travel/を取得しました
デイモンユアン

2

NGINXの公式ドキュメントでは、リダイレクトを有効にするためにrewriteディレクティブを使用する代わりに、returnディレクティブを使用することを推奨しています。これは、書き換えられるリクエストがそのサーバー向けではないため、そのサーバーブロックで処理されるためです。そのため、すべての処理が停止し、応答がすぐに送信されるため、代わりにreturnディレクティブを使用してリダイレクトが正しく実行されます。NGINXは、リダイレクトのリライトをここで推奨しません:http ://nginx.org/en/docs/http/converting_rewrite_rules.html

returnディレクティブの構文は次のとおりです。returncode URL; 元々永続的な書き換えを行っていたので、それに応じて、応答するコードとして301を使用して、永続的なリダイレクトであることを示すことができます。httpsアドレスはurlセクションで渡されます。リファレンス:http : //nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

したがって、正しい構成は

server {
listen      80;
server_name *.mydomain.com;

#Redirect all nonssl requests to ssl.
return 301 https://$server_name$request_uri;
}

これにより、おそらくワイルドカードサーバーブロックを使用して、SSLドメインに正しくリダイレ​​クトできます。上記のコメントで提案されているように、アンダースコアの汎用サーバー名「_」または$ hostを試すこともできます。知らせて下さい!


使用する方returnが一般的には優れていますが、推奨される構成はまだリダイレクトに$ server_nameを使用しているため、正しくありません。これは「* .mydomain.com」になります。正しい修正は、上記のコメントで@cjcによってすでに概説されています-の$host代わりに使用する必要があり$server_nameます。
マキシムDounin

はい、同意しました。ああ、私の注意のスパンは衰退しているようだ!
アプルヴァスカント

上記の中傷の代わりに、パフォーマンスを大幅に改善するssl構成のヒントを提供させてください。ワイルドカード証明書を使用している場合にSSLをセットアップする最も効率的な方法は、「sslホチキス止め」をセットアップすることです ssl_stapling on; リゾルバ8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify on; 参照-calomel.org/nginx.html
アプルバスカント

2
する必要がありますreturn 301 https://$host$request_uri;
-scarver2

return 301 https://$server_name$request_uri;ポート443でhttpsを使用するためにポート80、8080、および8181 をリッスンしています。問題は、リダイレクトされたURLに元のポート番号が残っていることです。80は問題ではありませんが、8080として出てくるhttps://example.com:8080
A.Grandt

-1

次のようなものを試してください:

server {
  listen 80;
  server_name ~^(.*)\.mydomain\.com$;
  set $servername $1;
  rewrite ^(.*)$ https://$servername.mydomain.com/$1;
}

キャッチは、ワイルドカードサーバーを定義し、その名前に基づいてリダイレクトを行うことです。


過度に寛容な正規表現グループ。
クズカイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.