最稳妥的nginx重定向方案是用return 301,单页精准跳转用location =精确匹配,目录级批量归档用rewrite捕获组,扩展名迁移用if+rewrite,务必验证语法、响应头及目标页可用性。

单页精准跳转(推荐用于关键旧路径)
对明确废弃的单个 URL,用 location = 精确匹配,避免误伤其他相似路径:
- location = /old-product.html { return 301 /products/; }
- location = /about-us.htm { return 301 /about/; }
- 注意 = 是精确匹配符号,不能省略;路径必须完全一致(含扩展名)
- 目标地址写相对路径(如
/products/)即可,Nginx 自动补全协议和域名
目录级批量归档(适合 /legacy/、/v1/ 类结构)
若旧内容集中在某个路径前缀下,用 rewrite 带捕获组统一处理:
- rewrite ^/legacy/(.*)$ /archive/$1 permanent;
- rewrite ^/v1/api/(.*)$ /api/v2/$1 permanent;
- $1 保留原始子路径,确保
/legacy/blog/2020→/archive/blog/2020 - 放在
server块顶层或专用location /legacy/内均可,但避免嵌套在复杂 if 中
全站旧扩展名迁移(如 .htm → .html)
针对大量同类型文件后缀变更,可结合 if + rewrite 统一处理:
- if ($request_filename ~ \.htm$) { rewrite ^(.*)\.htm$ $1.html permanent; }
- 该写法仅匹配以
.htm结尾的请求,不影响其他资源(如图片、CSS) - 注意:不要用
$host拼接完整 URL,防止 IP 直连时跳转失败;用相对路径更安全 - 测试时先临时改
permanent为redirect(即 302),确认逻辑无误再切回 301
验证与避坑要点
配置后务必执行三步验证:
- 运行
nginx -t检查语法,成功后再nginx -s reload - 用
curl -I http://yoursite.com/old-page.html查看响应头,确认含HTTP/1.1 301 Moved Permanently和正确Location - 浏览器访问时清空缓存或用隐身窗口——301 会被长期缓存,测试阶段易被误导
- 别忘了检查归档目标页是否真实可访问,否则会形成「301 → 404」链,损害 SEO











