301 永久重定向陷阱

当需要把一个地址重定向到另一个地址的时候,我们可以使用 301 永久重定向或者 302 临时重定向。

当需要把 http 变成 https,或者域名更换的时候,一般用 301。302 比 301 灵活,如果域名不是永久更改用 302 就比较合适。另外,在百度站长平台里面,网站迁移是需要用 301 的。

所以,在我需要把博客迁移到另一台主机并更换域名的时候,我用了 301。

server
    {
        listen 443 ssl http2;
        server_name https://aaa.aaa.aaa;
        // 省略
        return 301 https://bbb.bbb.bbb$request_uri;
    }

看上去没什么问题。浏览器访问确实重定向到了新的域名。

但是,当你想把 bbb 改成 ccc 的时候,浏览器依然访问的 bbb,甚至都没有向服务器发出请求就跳转到了 bbb。

永久重定向,确实是永久重定向,单程票,没有后悔的机会。如果你是做服务的,访客很多,而你恰巧需要再一次更改域名。你要么把 bbb 再重定向到 ccc,要么告诉用户清缓存。因为浏览器会缓存 301,并且这个缓存是永久的。

为了给自己反悔的机会,在 301 重定向的时候,最好告诉浏览器,不要缓存。

server
    {
        listen 443 ssl http2;
        server_name https://aaa.aaa.aaa;
        // 省略
        location /
        {
            add_header Cache-Control no-store;
            return 301 https://bbb.bbb.bbb$request_uri;
        }
    }

其实这里最好用 302,但是呢,考虑到 seo 的要求——301,我也只能这么做。

此外,因为博客是 wordpress,nginx 配置里有 “include rewrite/wordpress.conf” 这句。这个引入的 wordpress 配置文件里包含了 “location /”,这会导致自己配置 “location /” 的时候发生冲突,所以包含 wordpress 配置文件的那句需要注释掉。