我们以包含和块的以下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
也需要在所有子域服务器块中添加相同的内容……对吗?
答案1
您说得对,最好Strict-Transport-Security
在任何需要的地方都使用 HSTS 标头,以确保客户端即使sub.example.com
在之前访问example.com
或缓存的 HSTS 信息已过期的情况下也能获取它。
此includeSubDomains
标志会影响其所在的所有子域。这意味着includeSubDomains
on会对而不是sub.example.com
产生影响。(这很自然,因为如果 eg会影响 ,那就不好了。)*.sub.example.com
*.example.com
example.co.uk
*.co.uk
如果您不使用任何内容,
sub.sub.example.com
则可以让Strict-Transport-Security
您的子域名的标头不带有此标志。subA.example.com
無法保護subB.example.com
。
答案2
正确。includeSubdomains 选项用于对当前域提供的 html 页面内链接的所有资源强制使用 https。
引用https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/:
例如,HTML 响应https://www.example.com可以包括对来自的资源的请求https://example.com,确保为 example.com 的所有子域设置了 HSTS。
还要注意,如果你add_header
在 location { } 块内添加指令,你还需要add_header Strict-Transport-Security ...
在该块内重新定义。再次引用:
NGINX 配置块从其封闭块继承 add_header 指令,因此您只需将 add_header 指令放在顶级服务器块中即可。有一个重要的例外:如果块本身包含 add_header 指令,则它不会从封闭块继承标头,您需要重新声明所有 add_header 指令: