私の構成:
server {
listen 80;
server_name mydomain.com;
rewrite ^(.*)$ $scheme://www.mydomain.com$1;
}
server {
listen 80;
server_name www.mydomain.com;
return 301 https://www.mydomain.com$request_uri;
if ($Host !~* ^(www.mydomain.com)$ ) {
return 444;
}
}
server {
listen 443;
server_name www.mydomain.com;
ssl on;
ssl_certificate /path/to/www.mydomain.com_chain.pem;
ssl_certificate_key /path/to/www.mydomain.com.key;
...
}
何機能します:
mydomain.com
からwww.mydomain.com
へのリダイレクトwww.mydomain.com
からhttps://www.mydomain.com
へのリダイレクト何機能しません正しく:
https://mydomain.com
を入力すると、www.mydomain.com
へのリダイレクトは発生しませんが、リクエストはhttps://mydomain.com
としてアプリケーションサーバーに渡されます。上記のhttps://mydomain.com
問題の解決策は何ですか?
SSLサーバーブロックでifステートメントを使用して、ホストを確認します。
server {
listen 443;
server_name www.mydomain.com mydomain.com;
ssl on;
ssl_certificate /path/to/www.mydomain.com_chain.pem;
ssl_certificate_key /path/to/www.mydomain.com.key;
if ($Host = 'mydomain.com' ) {
rewrite ^/(.*)$ https://www.mydomain.com/$1 permanent;
}
...
}
私が推測したように、その理由は、ポート80がスキップされ、ポート443が直接アクセスされていたためです。次のserver
ブロックを追加すると、リダイレクトが有効になります。
server {
listen 443;
server_name mydomain.com;
ssl on;
ssl_certificate /path/to/www.mydomain.com_chain.pem;
ssl_certificate_key /path/to/www.mydomain.com.key;
rewrite ^(.*)$ $scheme://www.mydomain.com$1;
}
より良いまたはよりエレガントな解決策を誰かが知っているなら、あなたの答えを追加してください。
悪の場合 であるため、回避することを好みます。また、正規表現エンジンを実行する必要がないため、リライトよりもリターンを使用することを好みます。
server {
#default server that catches all undefined Host names
listen 80 default_server;
return 444;
}
server {
#redirecting server for non-www ssl and non ssl domains
listen 80;
liste 443 ssl;
server_name mydomain.com;
ssl_certificate /path/to/www.mydomain.com_chain.pem;
ssl_certificate_key /path/to/www.mydomain.com.key;
return 301 https://www.mydomain.com$request_uri$is_args$query_string;
}
server {
# redirecting server for www non ssl server
listen 80;
server_name www.mydomain.com;
return 301 https://mydomain.com$request_uri$is_args$query_string;
}
server {
# main server config
listen 443 ssl;
server_name www.mydomain.com;
ssl on;
ssl_certificate /path/to/www.mydomain.com_chain.pem;
ssl_certificate_key /path/to/www.mydomain.com.key;
# remaining config...
}