nginx https 443从无子域redirect到“www”子域

我的configuration:

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.comredirect到www.mydomain.com
  • www.mydomain.comredirect到https://www.mydomain.com

什么不能正常工作

  • 当我直接进入https://mydomain.com进入浏览器时,redirect到www.mydomain.com根本不会发生,但是请求被传递到应用程序服务器上https://mydomain.com
    • 它看起来好像端口80“入口”正在跳过,服务器正在直接访问端口443,但我不是一个Nginx的专家,所以我不能告诉

什么是上面的https://mydomain.com问题的解决scheme?

在您的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块启用redirect:

 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; } 

如果有人知道更好或更优雅的解决scheme,请添加您的答案。

我宁愿避免如果因为如果是邪恶的 ,我更喜欢使用返回重写,因为它不需要运行正则expression式引擎。

 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... }