Nginx 中的 HSTS:子域服务器块中是否也应添加 Strict-Transport-Security 标头?

Nginx 中的 HSTS:子域服务器块中是否也应添加 Strict-Transport-Security 标头?

我们以包含和块的以下nginx.conf配置文件为例:serverexample.comsubdomain.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标志会影响其所在的所有子域。这意味着includeSubDomainson会对而不是sub.example.com产生影响。(这很自然,因为如果 eg会影响 ,那就不好了。)*.sub.example.com*.example.comexample.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 指令:

相关内容