Nginx 重定向:强制执行子域名和 SSL

Nginx 重定向:强制执行子域名和 SSL

ServerFault 上有很多问题涵盖了这个问题的部分内容,但我很难将它们拼凑在一起。我有一个新的 nginx 服务器,安装了 Wildcard SSL 证书。一切正常。我想创建强制执行以下内容的重定向规则:

1) 必须强制使用 www 或子域名。因此,subdomain.domain.com 和 www.domain.com 都可以。domain.com 本身不可以,应该自动添加 www。

2)整个网站都必须强制使用 HTTPS,无论子域名是什么。

换句话说:

ttp://域名.com >> ttps://www.域名.com

ttp://subdomain.domain.com >> ttps://subdomain.domain.com

ttps://域名.com >> ttps://www.域名.com

ttps://subdomain.domain.com (这样就可以)

根据 Nginx 重写陷阱页面和本网站上的其他答案,我一直在使用这个配置代码:

server {
  listen 80;
  server_name *.domain.com;
  return 301 https://$server_name$request_uri;
}

还有这个:

server {
  listen 80;
  server_name ~^(.*)domain\.com;
  return 301 https://$server_name$request_uri;
}

我也尝试过使用$host而不是$server_name。

所有这些都很好地重定向了 http > https,但它始终默认为https://domain.com,无论子域名还是 www。有什么想法?

答案1

今天早上我又花了几个小时才找到答案。您需要两个额外的服务器块:一个用于强制执行 www,一个用于强制执行 https,同时保留通配符子域。以下是代码:

server {
    listen 80;
    listen 443;
    server_name domain.com;
    return 301 https://www.domain.com$request_uri;
}

server {
    listen 80;
    server_name ~^(?<subdomain>.+)\.domain\.com$;
    return 301 https://$subdomain.domain.com$request_uri;
}

server {
    listen 443 default_server;
    listen [::]:433 default_server ipv6only=on;

... the rest of your HTTPS server configuration goes here ...

第一个块查找 no-www,无论它是 HTTP 还是 HTTPS。这会重定向到 www.domain.com,这很容易。第二个块使用正则表达式将子域放入变量中,然后返回到相同的子域 + 域,只是带有 https。之后,第三个块可以包含常规服务器配置。

希望能帮助到你!

答案2

在我看来,您明确将其转发到 domain.com。您是否尝试过在 https:// 和 $server_name 之间添加 www?我就是这么做的,而且我有一个教程关于这种事情。示例配置文件可能会有用。

server {
  listen 80;
  server_name *.domain.com;
  return 301 https://www.$server_name$request_uri;
}

报告其运作情况,我们可以根据需要进行调整。

相关内容