如何基于nginx做301


大家好,我是Neo。

最近有几位做独立站的朋友火急火燎地来找我,说网站改版后,流量出现了断崖式下跌。一查原因,原来是URL结构变了,但旧链接没做处理,全是404。

这简直是“运营事故”!我们辛辛苦苦做的SEO,发的外链,因为一个改版全废了?

别慌。今天Neo就带大家深入聊聊,如何用Nginx这把“瑞士军刀”,通过301重定向(301 Redirect),把旧流量完美“嫁接”到新页面。无论你是想把 www.yoursite.com/zh-CN/ 变成 zh-cn.yoursite.com,还是单纯想做HTTP到HTTPS的强制跳转,这篇文章都能帮到你。


为什么是301?为什么是Nginx?

在开始写代码之前,我们需要明白两个概念:

  1. 301 Moved Permanently(永久移动):这是告诉Google等搜索引擎,“嘿,我的老家搬迁了,新地址在这里,请把以前积累的权重(信誉)都转到新地址去。” 这是对SEO最友好的重定向方式。
  2. Nginx:大多数独立站(Shopify除外,那是SaaS)如果部署在自己的服务器上(如AWS, 阿里云),大概率用的是Nginx。它处理并发能力极强,做重定向也是一把好手。

核心实战:从“目录”到“子域名”的无缝切换

这是最近一位做多语言站点的朋友遇到的具体需求: 他想把 https://www.yoursite.com/zh-CN/ 开头的请求,全部自动跳到 https://zh-cn.yoursite.com/

这样做的好处是显而易见的:子域名看起来更专业,且方便针对不同国家做独立的SEO策略。

方案一:使用 rewrite 指令(灵活强大)

这是最通用的方法,适合需要正则匹配的场景。

打开你的Nginx配置文件(通常在 /etc/nginx/nginx.conf/etc/nginx/sites-available/yoursite.conf),找到主域名的 server 块:

server {
    listen 443 ssl;
    server_name www.yoursite.com;

    # SSL证书配置省略...

    # 【Neo敲黑板】核心配置在这里
    # 解释:匹配以 /zh-CN/ 开头的所有路径
    rewrite ^/zh-CN/(.*)$ https://zh-cn.yoursite.com/$1 permanent;

    # 同理,处理保加利亚语
    rewrite ^/bg/(.*)$ https://bg.yoursite.com/$1 permanent;

    # 其他常规配置...
    location / {
        proxy_pass http://backend_server;
    }
}

Neo的解读:

  • ^/zh-CN/(.*)$:这是一段正则表达式。
    • ^ 代表开始。
    • (.*) 代表“捕获”后面的所有内容(比如 about-us),并把它存到变量 $1 中。
  • permanent:这个关键字至关重要,它告诉Nginx返回 301 状态码,而不是默认的302(临时重定向)。

方案二:使用 return 指令(性能更优)

如果你追求极致的性能,或者你的匹配规则比较简单,location 配合 return 是更好的选择。Nginx官方文档也更推荐这种写法,因为它的执行效率比 rewrite 高。

server {
    listen 443 ssl;
    server_name www.yoursite.com;

    # 针对中文目录的精准打击
    location ~ ^/zh-CN/(.*)$ {
        return 301 https://zh-cn.yoursite.com/$1;
    }

    # 针对保加利亚语的精准打击
    location ~ ^/bg/(.*)$ {
        return 301 https://bg.yoursite.com/$1;
    }

    # 默认流量处理
    location / {
        # 你的正常业务逻辑
    }
}

为什么这种方式更好? 因为 return 指令会直接停止Nginx对当前请求的后续处理,直接返回响应。而 rewrite 可能会在内部触发其他的规则检查,消耗微乎其微但确实存在的CPU资源。对于高并发的独立站,这点优化积少成多。


独立站运营必备的3种重定向场景

除了上面的“目录转子域名”,我们在运营中还会遇到这三种经典情况:

场景1:强制 HTTP 转 HTTPS(安全合规)

现在没有HTTPS的网站,Google Chrome会直接提示“不安全”,严重影响转化率。

server {
    listen 80;
    server_name www.yoursite.com yoursite.com;
    
    # $host 保持了用户请求的域名,$request_uri 保持了请求的路径和参数
    return 301 https://$host$request_uri;
}

场景2:WWW 与 非WWW 的统一(集中权重)

yoursite.comwww.yoursite.com 在搜索引擎眼里是两个不同的网站!分散权重是大忌。通常我们会选定一个为主(比如带www的),把另一个重定向过去。

# 这是一个专门负责“搬运”的server块
server {
    listen 443 ssl;
    server_name yoursite.com; # 监听不带www的域名

    # SSL配置...

    # 301重定向到带www的域名
    return 301 https://www.yoursite.com$request_uri;
}

场景3:爆款产品下架后的处理

如果你的爆款产品 best-shoes-2024 下架了,千万别直接删页面!用户点进来看到404会立刻关掉。 策略:重定向到同类产品页,或者父级分类页。

location = /products/best-shoes-2024 {
    return 301 https://www.yoursite.com/collections/shoes;
}

注意这里用了 =,表示精确匹配,效率最高。


Neo的避坑指南:实战中的血泪教训

在操作Nginx重定向时,有几个坑大家一定要避开:

  1. 浏览器缓存是“魔鬼”: 301是永久重定向,浏览器会把它缓存很久。如果你配置错了(比如陷入了死循环),即使你改回了服务器配置,你的浏览器可能还会记住那个错误的跳转。

    • 对策:测试时,永远使用Chrome的“无痕模式” (Incognito Mode),或者先用 return 302 测试,确认没问题了再改成 301
  2. 死循环(Redirect Loop): 比如你把 A 重定向到 B,又在 B 的配置里把 B 重定向回 A。浏览器会报错“重定向次数过多”。

    • 对策:配置完后,用 curl -I https://www.yoursite.com/zh-CN/ 这种命令行工具检查一下Header信息,看看它到底跳去哪了。
  3. 配置生效三部曲: 很多新手改完文件就去刷新网页,发现没变,以为没写对。其实你少了关键步骤:

    • Step 1: 改配置文件。
    • Step 2: 检查语法!输入 sudo nginx -t。如果看到 successful 再继续,否则网站会挂。
    • Step 3: 重载服务。输入 sudo systemctl reload nginx

总结

做好301重定向,是独立站技术SEO(Technical SEO)的基本功。它不仅能挽救因改版流失的流量,还能整合权重,提升排名。

  • 简单跳转:首选 return 301
  • 复杂规则:使用 rewrite
  • 测试原则:先用302测试,确认无误后切301,并使用无痕浏览器验证。

希望这篇文章能帮你的独立站平稳过渡,流量大涨!


参考资料