用 return 301 实现永久重定向可生成干净、seo 友好的分享链接,如将 /c/abc123?ref=ios → /share/abc123,需通过正则精准捕获 id 并避免干扰其他路由。

直接用 return 或 rewrite 指令就能实现,关键是匹配原始带参链接、提取关键标识、构造干净 URL,同时保留语义和 SEO 友好性。
识别并匹配原始分享链接
多数分享链接形如 /share?code=abc123&utm_source=wechat 或 /c/xyz?ref=mobile。你需要用 location + 正则精准捕获核心 ID,忽略无关参数。
- 若路径含固定前缀(如
/c/),推荐用location ~ ^/c/([a-zA-Z0-9_]{2,11})—— 匹配 ID 并限制长度,避免误触 - 若参数在 query string 中(如
?id=def456),可用if ($args ~* id=([^&]+))提取值,但注意if在 location 外慎用;更稳妥的方式是用map预处理或直接用rewrite的捕获能力 - 避免写
location /share这类宽泛匹配,否则会干扰静态资源或 API 路由
构造规范化干净链接
目标是把 /c/abc123?ref=ios → /share/abc123,或 /share.html?id=xyz → /share/xyz。重点在于:URL 更短、无冗余参数、路径语义清晰。
- 用
return 301 /share/$1;(配合前面正则捕获)是最简洁方式,不依赖内部重写流程 - 若需保留部分参数(如用于埋点的
v=2),可拼接:return 301 /share/$1?v=2; - 不要用
rewrite ... last去内部跳转,这属于“重写”而非“重定向”,浏览器地址栏不变,达不到“干净链接”效果
确保重定向状态码与缓存行为合理
用户点击分享链接后应看到新 URL,且搜索引擎只索引干净版。这就要求返回明确的 301,并避免被 CDN 或浏览器缓存错误版本。
- 一律用
return 301,不是302—— 表明该映射是永久性的,利于 SEO 权重传递 - 避免在重定向响应中携带
Set-Cookie或敏感 header,防止泄露 - 如果旧链接曾被大量传播,上线后建议用
curl -I验证响应头是否含Location: /share/xxx和301状态码
完整配置示例
以下将所有 /c/{id}(无论是否有查询参数)永久重定向为 /share/{id}:
location ~ ^/c/([a-zA-Z0-9_]{2,11}) {
return 301 /share/$1;
}
若还需兼容 /share?id=xxx 形式,可加一段:
location = /share {
if ($args ~* "id=([^&]+)") {
return 301 /share/$1;
}
}
注意:if 在 location = 内是安全的,且只在此路径下生效。











