私はnginxとさまざまなサブドメインを持っています:
a.mydomain.com
b.mydomain.com
c.mydomain.com
Nginxには4つのルールがあります。
1)書き換えルール:
server {
listen 80
server_name gl.udesk.org;
root /nowhere;
rewrite ^ https://a.mydomain.com$request_uri permanent;
}
2)httpsルール:
server {
listen 443;
server_name a.mydomain.com;
root /home/a/a/public;
ssl on;
ssl_certificate conf.d/ssl/a.crt;
ssl_certificate_key conf.d/ssl/a.key;
ssl_protocols ...
ssl_ciphers ...
ssl_prefer_server_ciphers on;
location ...
}
3)httpデフォルトルール:
server {
listen 80 default_server;
return 444;
}
4)httpsデフォルトルール:
server {
listen 443 default_server;
return 444;
}
だから私がnginxを起動して:
では、なぜnginxのhttpsルールを設定するのが非常に難しいのか、また、httpバージョンと同じ動作をするように適切に設定するにはどうすればよいですか?
新しい証明書の作成と追加:
ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;
今は機能しますが、SSL証明書が不要なソリューションがあります。証明書を提供せずに、 https://a.mydomain.comを除くすべてのhttps(ポート443)サブドメインのすべての接続をリセットするだけです
ポート443とSSLを混在させないでください。 Nginxは完全にポートに依存しません。ポート80を介してhttpsを提供することもできます。最新のnginxバージョンでは、
listen 1234 ssl;
そして、あなたはssl on;
行します。
ただし、httpsを提供する場合は、証明書を指定する必要があります。サーバーは、httpリクエストをhttpsリクエストに書き換えるときにhttpsに入ります。
SSLハンドシェイクが何よりも先に行われるため、プロトコルエラーが発生します。そう return 444
に到達していません。また、SSLハンドシェイクには、暗号化アルゴリズムに証明書/秘密鍵のペアを提供するために、証明書と秘密鍵が必要です。
return
ディレクティブは、書き換えモジュールの一部です。 ドキュメント をチェックすると、リクエストで機能することがわかります。 HTTPSでは、リクエストはハンドシェイクが完了した後にのみ行うことができます。
機能のリクエストがあります: https://trac.nginx.org/nginx/ticket/195 と回避策のソリューションが提供されています。
server {
listen 443 ssl;
server_name bbb.example.com;
ssl_ciphers aNULL;
ssl_certificate /path/to/dummy.crt;
ssl_certificate_key /path/to/dummy.key;
return 444;
}