nginx rewrite规则需按新旧url映射关系精准编写:商品页用location = /product.php + 正则提取id跳转至/products/$1;分类页通过if捕获cat参数并保留其他查询参数;搜索页直接重写并完整传递$args,确保seo权重平滑转移。

直接在 server 或 location 块里写 rewrite 规则,核心是用正则捕获旧 URL 中的关键参数,再按新版路径模板拼接,配合 permanent 标志做 301 跳转,确保 SEO 权重平滑转移。
明确新旧 URL 的映射关系
先梳理清楚要迁移的几类典型路径,比如商品页、分类页、搜索页。不要凭空写规则,建议列个映射表:
- 旧:
/product.php?id=123→ 新:/products/123-slug - 旧:
/category.php?cat=shoes&page=2→ 新:/categories/shoes?page=2 - 旧:
/search.php?q=wireless&sort=price→ 新:/search?q=wireless&sort=price
每条都对应一个正则表达式和替换模板,避免漏掉关键参数或误匹配。
商品详情页:简单参数 → RESTful 路径
这是最常见也最直接的场景。用 rewrite 提取 id,拼成新路径,加 permanent 发送 301:
location = /product.php {
rewrite ^/product\.php\?id=(\d+)$ /products/$1 permanent;
}
注意点:
- 用
=精确匹配路径,避免干扰其他 PHP 请求 -
\.和\?要转义,否则正则会出错 - 新版路径中 slug 可先留空,由后端根据 ID 查询并补全,Nginx 不必强求生成完整 slug
分类页:多参数 → 路径 + 查询字符串保留
老版分类常带多个参数,新版通常把主分类放进路径,其余参数保留在 query string 里。这时需分别捕获,并判断参数是否存在:
location = /category.php {
# 匹配 cat 参数,忽略 page、sort 等其他参数
if ($args ~* "cat=([^&]+)") {
set $cat $1;
rewrite ^/category\.php$ /categories/$cat?$args permanent;
}
}
更稳妥的做法是拆成多条规则,例如:
- 只含
cat:→/categories/shoes - 含
cat和page:→/categories/shoes?page=2 - 含额外参数(如
sort):统一保留到 query string,不丢弃
搜索页与通用跳转:保留查询参数,避免丢失语义
搜索类页面尤其要注意完整传递 $args,否则用户点击旧链接会丢失关键词:
location = /search.php {
rewrite ^/search\.php$ /search?$args permanent;
}
如果新版搜索路径支持更简洁形式(如 /s/keyword),可加一层判断:
- 当
q参数存在且非空时,重写为/s/$arg_q - 否则 fallback 到带参数的
/search?形式
用 if + $arg_q 变量比解析整个 $args 更安全,也更易读。











