
如何基于nginx做301
大家好,我是Neo。
最近有几位做独立站的朋友火急火燎地来找我,说网站改版后,流量出现了断崖式下跌。一查原因,原来是URL结构变了,但旧链接没做处理,全是404。
这简直是“运营事故”!我们辛辛苦苦做的SEO,发的外链,因为一个改版全废了?
别慌。今天Neo就带大家深入聊聊,如何用Nginx这把“瑞士军刀”,通过301重定向(301 Redirect),把旧流量完美“嫁接”到新页面。无论你是想把 www.yoursite.com/zh-CN/ 变成 zh-cn.yoursite.com,还是单纯想做HTTP到HTTPS的强制跳转,这篇文章都能帮到你。
为什么是301?为什么是Nginx?
在开始写代码之前,我们需要明白两个概念:
- 301 Moved Permanently(永久移动):这是告诉Google等搜索引擎,“嘿,我的老家搬迁了,新地址在这里,请把以前积累的权重(信誉)都转到新地址去。” 这是对SEO最友好的重定向方式。
- 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.com 和 www.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重定向时,有几个坑大家一定要避开:
-
浏览器缓存是“魔鬼”: 301是永久重定向,浏览器会把它缓存很久。如果你配置错了(比如陷入了死循环),即使你改回了服务器配置,你的浏览器可能还会记住那个错误的跳转。
- 对策:测试时,永远使用Chrome的“无痕模式” (Incognito Mode),或者先用
return 302测试,确认没问题了再改成301。
- 对策:测试时,永远使用Chrome的“无痕模式” (Incognito Mode),或者先用
-
死循环(Redirect Loop): 比如你把 A 重定向到 B,又在 B 的配置里把 B 重定向回 A。浏览器会报错“重定向次数过多”。
- 对策:配置完后,用
curl -I https://www.yoursite.com/zh-CN/这种命令行工具检查一下Header信息,看看它到底跳去哪了。
- 对策:配置完后,用
-
配置生效三部曲: 很多新手改完文件就去刷新网页,发现没变,以为没写对。其实你少了关键步骤:
- Step 1: 改配置文件。
- Step 2: 检查语法!输入
sudo nginx -t。如果看到successful再继续,否则网站会挂。 - Step 3: 重载服务。输入
sudo systemctl reload nginx。
总结
做好301重定向,是独立站技术SEO(Technical SEO)的基本功。它不仅能挽救因改版流失的流量,还能整合权重,提升排名。
- 简单跳转:首选
return 301。 - 复杂规则:使用
rewrite。 - 测试原则:先用302测试,确认无误后切301,并使用无痕浏览器验证。
希望这篇文章能帮你的独立站平稳过渡,流量大涨!
参考资料: