我使用的是 nginx 配置摘自这篇文章实施重定向http://(www.)example.com->https://example.com:
server {
server_name www.example.com example.com;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
<possibly other ssl directives if you have a separate cert and key for www>
server_name www.example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
ssl_certificate /path/to/server.cert;
ssl_certificate_key /path/to/server.key;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
<locations for processing requests>
}
我想将 HSTS 添加到其中,因此我正在关注nginx 文档,相当于添加
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
到两个 SSL 服务器块(如上所述)。
TLDR:第二个服务器块中的 STS 标头是否必要?
然而,我正在阅读一些有关这个主题的文章,尤其是这篇博文似乎认为:
...如果您的规范 URL 是 www.example.com,则 includeSubDomains 令牌将不会保护 example.com,因为这不是 www.example.com 的子域。解决方案是从 www.example.com 向 上的未缓存资源(
https:// example.com
例如 1px 图像)发出请求,并确保 https:// example.com 设置 HSTS 标头。
我想这是正确的,因为如果你直接去规范https://www.example.com
那么它只会保护http://*.www.example.com.
https://example.com
但是,如果您的规范 URL 是并且您使用 ,则这似乎不是问题includeSubDomains
。我在 Chrome 上进行了测试,它执行了以下操作http://www.example.com
(307) -> https://www.example.com
(301) -> https://example.com
。
那么Strict-Transport-Security
第二个listen 443 ssl
www.example.com
块中的标头是否必要? 无论如何,直接请求都会是 SSL,并且它会在从第三个服务器块重定向时https://www.example.com
拾取 STS标头,以在将来提供保护。includeSubDomains
http://www.example.com
答案1
是的,最好在两个server
块中都有 STS 标头,原因如您在问题中所写。
从另一个角度来看,在服务器中指定标头也没有什么坏处example.com
。