Nginx 学习笔记 (4)

自动跳转 HTTPS

单单开启 HTTPS 不足以保障安全,若仍保留 HTTP 更是门户大开,况且从 SEO 的角度来说,协议不同也会视为内容重复的两个网站。比较稳妥的做法是,重定向 HTTP 请求至 HTTPS,降低内容不安全的风险。这是服务器端跳转

server {
    ...
    listen 80;
    server_name yourdomain.com;

    return 301 https://$host$request_uri;
    ...
}

更进一步地,建议开启 HSTS 以防范 SSL 剥离攻击 (中间人攻击的一种)。HSTS 会告知浏览器今后访问该站点都得使用 HTTPS,即使用户在地址栏输入的 HTTP 亦然。这是浏览器端跳转,不用再 301,可改善服务器的性能。

server {
    ...
    listen 443 ssl;

    add_header Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload';
    ...
}

不过还是有盲点存在。新访客首次访问,可不晓得 HSTS 的规矩,得经历一次 HTTP → HTTPS 的过程才行,这中间攻击者就大有文章可做。所以有一个 HSTS 预加载列表,第一次访问就教你做人。要加入这个 Preload List,四项条件缺一不可:

  1. 具有合法 CA 签发的有效证书;
  2. HTTP 重定向至 HTTPS (即全站 HTTPS);
  3. 子域名全数部署 HTTPS (可以用 通配符证书 简化流程);
  4. 在返回的响应头 (Response Header) 包含字段 Strict-Transport-Security。

HSTS Preload.png

如果前面按步骤一步一个脚印去配置 (或使用的 Certbot),相信条件已然满足,向 hstspreload.org 提交您的网站便是。但要提醒,启用了 HSTS 的网站恢复原状比较困难,操作前请慎重考虑后续会否继续使用 HTTPS。


自动跳转 www

虽说现在带 www 俨然是一种 old-school 的做法,但实务上还是加上 www 显得更 formal,同时免除裸域不支持 CNAME 记录且 Cookie 作用域过大的尴尬,故简单介绍自动跳转 www 的方法。从 SEO 角度来说,不建议 www 和 non-www 站点同时存在 (如果内容重复的话),将造成权重分散,最好两者择其一。

server {
    ...
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;
    
    if ($host != www.yourdomain.com) {
        return 301 https://www.yourdomain.com$request_uri;
    }
    ...
}