Apache下.htaccess重写URL移除查询参数规则不生效怎么办
Apache .htaccess 重写规则不生效排查+对应需求可用规则
规则完全无响应的前置排查项
所有重写规则不生效,90%以上是基础配置未开启,按顺序检查:
- 开启Apache重写模块:找到Apache主配置文件
httpd.conf,定位到LoadModule rewrite_module modules/mod_rewrite.so行,删除行首的#注释符,保存后重启Apache。未开启模块时所有重写规则不会被执行。 - 开启目录.htaccess权限:在
httpd.conf中找到站点对应目录的<Directory>配置块,将AllowOverride None修改为AllowOverride All,配置为None时Apache会直接忽略目录下所有.htaccess文件,无论文件内写什么规则都不会生效,修改后需重启Apache。 - 校验.htaccess文件本身:文件名必须为全小写的
.htaccess(开头带半角点,无.txt等后缀),上传至站点根目录(即与news文件夹同级的Web根路径)。 - 排除缓存干扰:301永久重定向会被浏览器强制缓存,测试阶段一律先用
R=302临时重定向调试,确认规则完全符合预期后再改为R=301,测试时优先使用浏览器无痕模式访问。
你原有规则的问题
你之前写的规则仅实现了从查询串中剔除id参数的逻辑,没有完成「把id值拼入访问路径」的需求,就算规则生效也无法达到你要的跳转效果。另外你漏写了重写引擎开启的必填行,这也是新手最常犯的错误。
对应需求的完整可用规则
所有规则需写在.htaccess文件内,文件第一行必须写RewriteEngine On,缺省该行所有规则无效。
目标1:原URL重写为 /news/[id值] 格式
该规则同时实现地址栏跳转和后端正常解析,跳转后页面不会404,后端代码无需修改,仍可通过$_GET['id']获取参数:
RewriteEngine On # 将带?id参数的原URL 302跳转至路径格式的新地址,测试完成后可将R=302改为R=301 RewriteCond %{QUERY_STRING} ^id=([a-zA-Z0-9]+)$ [NC] RewriteRule ^news/new\.html$ /news/%1? [R=302,L] # 内部转发:将路径格式的请求转回new.html处理,用户端无感知 RewriteRule ^news/([a-zA-Z0-9]+)$ /news/new.html?id=$1 [L]
规则关键点说明:
- 重写规则末尾的
?作用是丢弃原URL的查询参数,避免跳转后参数残留 - 第二步转发为服务器内部逻辑,不会改变浏览器地址栏显示内容
目标2:原URL重写为 /news/new 格式
如果仅需要剔除查询参数,跳转到固定的new路径,使用以下规则即可:
RewriteEngine On RewriteCond %{QUERY_STRING} ^id= [NC] RewriteRule ^news/new\.html$ /news/new? [R=302,L]
调试技巧:如果配置后仍无响应,可以先写一条最简测试规则:
RewriteRule ^test\.html$ /index.html [R=302,L],访问域名下的test.html,如果能正常跳转到首页,说明rewrite模块和.htaccess权限已经正常,再逐步调试业务规则即可。
内容的提问来源于stack exchange,提问作者DoutorWhite
相关产品推荐
相关产品推荐

