将路径转换为查询字符串并保留初始查询参数
解决.htaccess路径重写的异常问题
嘿,我来帮你搞定这个重写规则的小问题!先看看你现有规则里的几个坑:
RewriteEngine On RewriteCond %{REQUEST_FILENAME}!-f RewriteCond %{REQUEST_FILENAME}!-d RewriteRule ^/?product/(.*?)/?$ /product?id=$1 [L,QSA]
这里有两个关键问题:一是RewriteCond的规则里少了空格(%{REQUEST_FILENAME}!-f应该是%{REQUEST_FILENAME} !-f),Apache根本没法正确解析这个条件;二是用了非贪婪匹配的.*?,结合结尾可选的/?,很容易导致捕获的产品ID内容截断(就是你说的出现t...这类异常内容的原因)。
修正后的完整规则
RewriteEngine On # 确保请求的不是实际存在的文件或目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 精准匹配/product/后的产品ID(不含斜杠),兼容结尾有无斜杠的情况 RewriteRule ^/?product/([^/]+)/?$ /product?id=$1 [L,QSA]
为什么这样改能解决问题?
- 修复条件格式错误:补上
RewriteCond里的空格后,规则才会正确跳过实际存在的文件和目录,避免不必要的重写干扰。 - 用
[^/]+替代.*?:[^/]+会精准匹配所有不含斜杠的字符,完全符合你产品ID的格式需求,不会出现捕获内容截断的情况。 - 保留
QSA标记:这个标记会自动把原URL里的所有查询参数(比如utm_campaign=yyyyy,不管数量多少)追加到重写后的URL里,完美适配你参数数量不固定的场景。
测试你的示例URL:
原请求:
http://acme.com/product/xxxxxx?utm_campaign=yyyyy
重写后:http://acme.com/product?id=xxxxxx&utm_campaign=yyyyy
完全符合你的预期,不管原URL有没有参数、参数有多少个,都能正常处理。
内容的提问来源于stack exchange,提问作者Derekos
相关产品推荐
相关产品推荐

