Aaron Lau(韩栖)

Nginx 学习笔记 (4) —— 自动跳转 https 或 www

379 字

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

server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$host$request_uri;
}

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

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

不过还是有盲点存在。新访客首次访问,可不晓得 HSTS 的规矩,得经历一次 HTTP → HTTPS 的过程才行,这中间攻击者就大有文章可做。所以有一个 HSTS 预加载列表,第一次访问就教你做人。合法证书、全站 HTTPS、子域名全数 HTTPS、响应头带 Strict-Transport-Security,条件满足就向 hstspreload.org 提交。但要提醒,启用了 HSTS 的网站恢复原状比较困难。

至于 www,虽说带 www 俨然是一种 old-school 的做法,但实务上显得更 formal,同时免除裸域不支持 CNAME 记录且 Cookie 作用域过大的尴尬。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;
    }
}

<small>原载 App-scope,有删改。</small>

App-scope · 教程 · Nginx