htaccess重写规则仅item页异常跳转带query参数URL问题修复
问题原因
该异常是站点根目录下近期新增了名为item的物理文件夹导致的:
- Apache默认开启
mod_dir模块的DirectorySlash配置,会自动对访问目录但未携带尾斜杠的请求返回301重定向,补全尾斜杠 - 该逻辑和你配置的伪静态规则执行顺序冲突:访问
/item时伪静态规则先触发,将请求内部重写为index.php?page=item,后续mod_dir的斜杠校正逻辑会把重写后的查询参数一并带到重定向地址,最终跳转到/item/?page=item - 其他路径正常是因为不存在同名物理文件夹,不会触发
mod_dir的斜杠校正逻辑;你测试时访问带尾斜杠的/item/无异常,也完全匹配该故障特征——带斜杠的请求不会触发斜杠补全逻辑,不会带出异常参数。这也和你描述的“此前item页面正常、仅近期出现故障”的时间线吻合,基本可以确定是近期上传/生成了同名的item文件夹导致的冲突。
修复方案
方案1(优先推荐,10秒解决)
直接通过服务器文件管理器、FTP等工具打开站点根目录,找到名为item的冗余文件夹(为近期误上传/生成的残留文件,和伪静态路由重名),删除该文件夹后清空浏览器缓存再访问,故障会直接恢复。
方案2(item文件夹为业务必须留存、无法删除时使用)
调整根目录下的.htaccess规则,在原有伪静态逻辑前增加物理文件/目录排除,同时阻断重定向时的参数透传,完整规则代码如下:
RewriteEngine On # 排除真实存在的物理文件,不做伪静态重写 RewriteCond %{REQUEST_FILENAME} !-f # 排除真实存在的物理目录,不做伪静态重写 RewriteCond %{REQUEST_FILENAME} !-d # 原有伪静态规则 RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?page=$1 [QSA,L] # 可选配置:统一URL规范,将带尾斜杠的同格式路径301跳转到无斜杠版本,避免重复内容 RewriteRule ^([a-zA-Z0-9_-]+)/$ /$1 [L,R=301]
规则修改保存后,清空浏览器缓存再访问即可恢复正常。
内容的提问来源于stack exchange,提问作者kb0000
相关产品推荐
相关产品推荐

