让我们使用以下nginx.conf
配置文件,其中包含和server
块:example.com
subdomain.example.com
http {
...
server {
listen [::]:80 ipv6only=off default_server;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen [::]:443 ipv6only=off ssl default_server;
server_name example.com;
add_header Strict-Transport-Security
"max-age=63072000; includeSubDomains; preload" always;
...
}
server {
listen [::]:80 ipv6only=off;
server_name subdomain.example.com;
return 301 https://subdomain.example.com$request_uri;
}
server {
listen [::]:443 ipv6only=off ssl;
server_name subdomain.example.com;
add_header Strict-Transport-Security
"max-age=63072000; includeSubDomains; preload" always; # <-- again ???
...
}
}
标头的includeSubDomains
部分显然告诉浏览器标头也适用于所有子域。
但是,如果该浏览器在看到之前就访问subdomain.example.com
过example.com
,那也没有任何帮助,不是吗?因此,为了涵盖这种情况,我也需要add_header
在所有子域服务器块中添加相同的内容......对吗?
您是正确的,最好
Strict-Transport-Security
在您需要的任何地方都有 HSTS 标头,以确保客户端即使在sub.example.com
之前访问过它example.com
或缓存的 HSTS 信息已过期也能获得它。该
includeSubDomains
标志会影响它所在的所有子域。这意味着includeSubDomains
onsub.example.com
生效*.sub.example.com
而不是*.example.com
。example.co.uk
(这是很自然的,因为如果 eg会影响,那就不好了*.co.uk
。)如果您不使用任何
sub.sub.example.com
内容,则可以在没有此标志的情况下保留Strict-Transport-Security
子域的标题。subA.example.com
无法保护subB.example.com
。正确的。includeSubdomains 选项用于对当前域提供的 html 页面内链接的所有资源强制执行 https。
引用https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/:
另请注意,如果您
add_header
在 location { } 块内添加指令,则还需要add_header Strict-Transport-Security ...
在该块内重新定义。再次引用: