.htaccess RewriteRule重写至shtml文件时GET参数丢失如何解决
核心原因说明
该问题本质是shtml依赖的SSI(服务器端包含)处理逻辑和PHP的CGI/FPM处理逻辑不同:PHP默认会自动读取全局QUERY_STRING参数,而SSI的参数传递需要额外满足Apache的配置要求。
解决步骤
1. 排查基础配置问题
- 关闭mod_negotiation的MultiViews特性,该特性会在重写规则执行前自动匹配静态资源后缀,导致参数丢失,在
.htaccess开头添加配置:
Options -MultiViews +Includes AddType text/html .shtml AddOutputFilter INCLUDES .shtml
- 先验证SSI本身是否能正常读取查询参数:新建
test.shtml写入内容<!--#echo var="QUERY_STRING" -->,直接访问你的域名/test.shtml?q=test,如果页面无法输出q=test,说明SSI配置异常,先修复该基础配置再排查重写问题。
2. 调整Rewrite规则
原有规则仅适配PHP这类直接读取全局请求参数的后端,适配shtml需要修改标志位:
# 把原有L标志替换为PT(Pass Through),确保重写后的请求完整传递给SSI处理模块,QSA保留原有额外查询参数 RewriteRule ^search/(.*)$ LookAt.shtml?q=$1 [PT,NC,QSA]
3. 兜底方案:通过环境变量传递参数
如果上述方案仍然无效,可以通过重写规则设置自定义环境变量传递参数,SSI读取重写后的环境变量即可:
RewriteRule ^search/(.*)$ LookAt.shtml [PT,NC,QSA,E=SEARCH_KEY:$1]
在LookAt.shtml中读取参数:
<!--#echo var="REDIRECT_SEARCH_KEY" --> <!-- 重写后的环境变量默认会添加REDIRECT_前缀 -->
4. 进阶排查
开启Apache重写日志,确认重写后的QUERY_STRING是否符合预期,排除规则匹配错误的问题。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

