nginx https 443 从无子域名重定向到“www”子域名

nginx https 443 从无子域名重定向到“www”子域名

我的配置:

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.comwww.mydomain.com
  • 重定向自www.mydomain.comhttps://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...
}

相关内容