我最近更改了我的 nginx 配置,将所有 http 流量重定向到 https(并将所有 www 流量重定向到 no-www)。
是否也应该添加add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
到我的服务器块中?或者说,由于我已经重定向了所有流量,所以没有必要这样做?如果能知道这样做的利弊(如果有的话),那就太好了。
如果相关的话,我当前的虚拟主机配置是:
server {
server_name example.com www.example.com;
listen 80;
return 301 https://example.com$request_uri;
}
server {
server_name www.example.com;
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/cert_chain.crt;
... other SSL related config ...
return 301 https://example.com$request_uri;
}
server {
server_name example.com;
listen 443 ssl;
... other SSL related config ...
... remaining server configuration ...
}
答案1
HSTS 告知浏览器始终使用 https,而不是 http。添加该配置可能会减少从 http 转发到 https 的需要,因此可能非常轻微提高网站性能和非常轻微减少服务器负载。
作为参考,以下是我在基于 Nginx 的网站上使用的安全标头。我将其保存到单个文件中,并将其包含在所有需要它的服务器中,包括 http 和 https 服务器。它允许加载一些常见资源,如 Google 和 Facebook。
# Security headers
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Content-Security-Policy "default-src 'self' www.google-analytics.com ajax.googleapis.com www.google.com google.com gstatic.com www.gstatic.com connect.facebook.net facebook.com;";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "origin";
澄清
您仍然需要将 http 重定向到 https。
答案2
接受的答案很棒,但已经过时,并且存在我在逐行研究时发现的缺陷。
HSTS 标头的持续时间必须至少为三个月才能满足安全要求。我在安全标头代码片段中使用了以下内容,以在 SSL 测试中获得 A+:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
其次,使用X-Frame-Options
已弃用(并且从未得到许多/大多数主流浏览器的支持)。当前标准(即在所有主流现代浏览器中实施)是Content-Security-Policy
(CSP)。
add_header Content-Security-Policy 'frame-ancestors https://mywebapp.mywebsite.example';
从示例中可以明显看出,CSP 标头必须根据每个站点进行设置(除非我还没有见过的巧妙的正则表达式/等等)。
答案3
我建议指定always
参数以add_header
将此标题也包含在内部生成的错误页面中。
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
此外,添加preload
到响应头中这样你以后就可以将你的网站添加到预加载列表中