.htaccess URL重写问题:带PHP $_GET参数的原路径未跳转至新路径
问题原因分析
你的第一个RewriteRule不生效的核心原因是:Apache的RewriteRule默认只匹配URL的路径部分(即category.php这部分),不会包含后面的查询字符串(?filter_ids=21)。所以你写的^category\.php\?filter_ids=21$这个模式永远不会被匹配到,自然不会触发跳转。
修正后的规则方案
你需要结合RewriteCond(条件判断)来匹配查询字符串,然后再用RewriteRule处理跳转。以下是修正后的完整规则:
# 1. 处理原路径跳转到新路径:https://www.abc.com/category.php?filter_ids=21 → https://www.abc.com/xyz RewriteCond %{QUERY_STRING} ^filter_ids=21$ RewriteRule ^category\.php$ /xyz [R=301,L] # 2. 处理新路径反向代理到原脚本:https://www.abc.com/xyz → 实际访问category.php?filter_ids=21 RewriteRule ^xyz$ category.php?filter_ids=21 [QSA,L]
关键细节说明
RewriteCond %{QUERY_STRING} ^filter_ids=21$:这条条件用来检查URL的查询字符串是否完全等于filter_ids=21。如果你的场景允许原路径带额外参数(比如category.php?filter_ids=21&foo=bar),可以把条件改成%{QUERY_STRING} (^|&)filter_ids=21(&|$),这样只要包含filter_ids=21参数就会触发跳转。[R=301,L]:R=301表示永久重定向,对SEO友好;L表示这是最后一条规则,匹配后不再执行后续规则。这里可以去掉QSA,因为我们要跳转到的新路径/xyz不需要保留原查询参数(如果需要保留的话可以加上,但根据你的需求应该不需要)。- 第二条规则保持不变即可,它已经能正确将
/xyz映射到原脚本。
测试注意事项
修改规则后,记得:
- 重启Apache服务器让规则生效
- 清除浏览器缓存(因为301重定向会被浏览器缓存,之前的缓存可能导致测试结果不准确)
内容的提问来源于stack exchange,提问作者Isaac Ng
相关产品推荐
相关产品推荐

