Nginxredirect:强制子域和SSL

ServerFault上有很多问题涉及这个问题的一部分,但是我很难将它们拼凑在一起。 我有一个安装了Wildcard SSL证书的新的nginx服务器。 所有的工作正常。 我想创build强制执行以下的redirect规则:

1)必须有www或子域强制执行。 所以,subdomain.domain.com和www.domain.com是好的。 domain.com本身不是,应该自动添加www。

2)HTTPS必须在整个站点执行,而不pipe子域是什么。

换一种说法:

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

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

ttps://domain.com >> ttps://www.domain.com

ttps://subdomain.domain.com(这很好)

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

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。

所有这些redirecthttp> https就好了,但它总是默认为https://domain.com ,无论子域名还是www。 思考?

今天早上,我花了几个小时的时间find了答案。 您需要两个额外的服务器块:一个强制执行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。 这redirect到www.domain.com,很容易。 第二个块使用正则expression式把子域放在一个variables中,然后返回到同一个子域+域,只是用https。 之后,第三个块可以包含通常的服务器configuration。

希望能帮助到你!

它看起来像你是明确转发到domain.com。 您是否曾尝试在https://和$ server_name之间添加www? 这就是我所做的,我有一个关于这种事情的教程 。 示例configuration文件可能有一定的用处。

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

回报这是如何工作的,我们可以根据需要调整它。