网站改版时nginx 301重定向核心是每个旧url必须精准、永久、无损跳转至对应新url,保留路径和查询参数;优先用return 301而非rewrite,涵盖单页、整站换域、目录调整等场景,并须通过nginx -t和curl -i严格验证。

网站改版时用 Nginx 做 301 重定向,核心就一条:每个旧 URL 必须精准、永久、无损地跳到对应的新 URL,路径和查询参数一个都不能少。搜索引擎靠这个识别“内容搬家了”,才把排名、外链权重完整传过去。
必须用 return 301,别轻易套 rewrite
return 301 是最稳的选择——不走正则匹配、不触发 location 嵌套、不引发循环跳转,语法简单,SEO 友好度最高。
- 单页迁移(如 /about.html → /company/)直接写:
location = /about.html { return 301 /company/; } - 整站换域名(old.com → new.com)在旧域名的 server 块里统一处理:
return 301 https://new.com$request_uri;($request_uri自动带路径+?后全部参数) - 避免用 rewrite ... permanent 包裹,除非真要正则提取路径(比如 /blog/123 → /post/123);用了 rewrite 就必须加 permanent,否则默认是 302,不传权重
路径映射要一一对应,不能全跳首页
用户点的是 /products?id=2026,跳过去必须是 /items/2026 或至少 /products?id=2026,而不是 / —— 否则所有流量归零,大量 404,SEO 权重直接断裂。
- 目录结构调整(如 /news/ → /blog/):
location ^~ /news/ { rewrite ^/news/(.*)$ /blog/$1 permanent; } - 去掉 .php 后缀(/contact.php → /contact):
location ~ \.php$ { rewrite ^(/.*?)(?:\.php)(\?.*)?$ $1$2 permanent; } - 批量文件迁移(如 /old-img.jpg → /assets/img.jpg)优先用 location = 精确匹配,比正则更轻量安全
协议与域名必须一步到位,别留中间态
HTTP 跳 HTTPS、www 跳裸域、旧子域名跳新子域名,都要在 80 端口 server 块中完成,且目标地址写死或用 $host + $request_uri,不依赖 $scheme 或 $http_host(易为空或错配)。
- 强制 HTTPS:
server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; } - 统一主域名(www → 裸域):
server { listen 80; server_name www.example.com; return 301 http://example.com$request_uri; } - HTTPS 下再做一次规范化(如 www.example.com:443 → example.com:443),防止两个 HTTPS 入口并存,造成重复内容
上线前必须验证三件事
配置写完不等于生效,漏掉任一环节都可能让 SEO 权重悄悄流失。
- 先运行 nginx -t 检查语法,特别注意分号不能丢、引号不能错
- 用 curl -I http://old.com/some-page?ref=utm 看响应头:必须是 301 Moved Permanently,且 Location 值完全正确(含参数)
- 打开新站目标页面确认能正常访问,301 只改路径,不解决内容缺失——跳过去是 404,权重照样归零











