我的配置:
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
- 看起来好像端口 80 “入口”被跳过了,服务器直接在端口 443 上被访问,但我不是 Nginx 专家,所以我无法分辨
上述问题的解决方案是什么https://mydomain.com
?
答案1
使用 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;
}
...
}
答案2
正如我所料,原因是跳过了 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;
}
如果有人知道更好或更优雅的解决方案,请添加您的答案。
答案3
我宁愿避免,因为if 是邪恶的,而且我更喜欢使用 return 而不是 rewrite ,因为它不需要运行正则表达式引擎。
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...
}