求助:.htaccess重写含下划线与参数的孤立URL实现301跳转
解决osCommerce到OpenCart的旧URL 301重定向问题
嘿,我来帮你搞定这个.htaccess重定向的难题!你提到的两种旧URL格式,核心是要根据products_id参数直接映射到对应的新友好URL——其实查询字符串里的下划线根本不会困扰.htaccess引擎,我们直接匹配参数值就行,不用额外处理下划线替换。
具体实现步骤
首先确保你的.htaccess开头已经开启了重写引擎:
RewriteEngine On RewriteBase /
接下来,针对每个旧URL对应的新URL,添加两条规则(分别覆盖带cPath和不带cPath的情况)。以你给出的例子为例:
# 匹配带cPath和products_id=75的旧URL RewriteCond %{QUERY_STRING} ^cPath=\d+&products_id=75$ [NC] RewriteRule ^catalog/product_info\.php$ /2-channel-guitar-preamp? [R=301,L] # 匹配仅带products_id=75的旧URL RewriteCond %{QUERY_STRING} ^products_id=75$ [NC] RewriteRule ^catalog/product_info\.php$ /2-channel-guitar-preamp? [R=301,L]
规则细节解释
RewriteCond %{QUERY_STRING} ...:精准匹配查询字符串,^cPath=\d+&products_id=75$表示匹配任意数字的cPath加上products_id=75的组合;[NC]表示不区分大小写,兼容可能的大小写差异。RewriteRule ^catalog/product_info\.php$ ...:匹配旧的文件路径,注意要转义.避免被正则当作通配符。- 末尾的
?:作用是清除原查询字符串,避免重定向后的URL带上旧的products_id或cPath参数。 [R=301,L]:R=301表示永久重定向(对SEO友好),L表示执行完这条规则后停止后续规则匹配。
批量处理建议
因为你有大约100条这样的映射,要是手动一条条写确实有点麻烦:
- 如果你的
products_id和新URL有规律(比如products_id=X对应/product-X),可以用正则批量匹配,比如:
但如果新URL是完全自定义的无规律名称,那只能手动添加每条映射规则,这也是最稳妥的方式。RewriteCond %{QUERY_STRING} ^(cPath=\d+&)?products_id=(\d+)$ [NC] RewriteRule ^catalog/product_info\.php$ /product-%2? [R=301,L]
测试小提示
建议先把R=301改成R=302(临时重定向)测试所有规则,确认跳转正确后再改回R=301,避免浏览器缓存错误的重定向规则。
内容的提问来源于stack exchange,提问作者TreeHerder
相关产品推荐
相关产品推荐

