.htaccess重写规则缓存缺失时查询字符串丢失问题求解
问题原因
问题出在第一条匹配查询字符串的RewriteRule末尾的?标记:该标记的作用是直接丢弃原有请求的查询字符串,当缓存文件存在时,这个标记可以避免查询参数被额外附加到缓存文件地址后,符合预期逻辑;但当缓存文件不存在时,查询参数已经被这条规则清空,后续跳转到/index.php的重写规则自然无法拿到原始参数。
修复方案
给缓存重写规则增加文件存在性判断,只有缓存真实存在时才执行重写,同时给最终回退规则增加QSA标记保证参数传递,修改后的完整规则如下:
RewriteEngine On RewriteBase / # 首页缓存规则 RewriteRule ^$ /htcache/index.html [L] # 带page参数的分类页缓存:仅缓存文件存在时执行重写 RewriteCond %{QUERY_STRING} page=(.*) RewriteCond %{DOCUMENT_ROOT}/htcache/videos/$1/$2/$3/$0%{QUERY_STRING}.html -f RewriteRule ^(.)([^/])([^/])[^/]*/$ /htcache/videos/$1/$2/$3/$0%{QUERY_STRING}.html? [L] # 静态html文件缓存:仅缓存文件存在时执行重写 RewriteCond %{DOCUMENT_ROOT}/htcache/video/$1/$2/$3/$0 -f RewriteRule ^(.)([^/])([^/])[^/]*\.html$ /htcache/video/$1/$2/$3/$0 [L] # 无参数分类页缓存:仅缓存文件存在时执行重写 RewriteCond %{DOCUMENT_ROOT}/htcache/videos/$1/$2/$3/$0index.html -f RewriteRule ^(.)([^/])([^/])[^/]*\/$ /htcache/videos/$1/$2/$3/$0index.html [L] # 缓存不存在时回退到index.php,保留原始查询参数 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L,QSA]
修改说明
- 所有缓存重写规则新增
-f判断,只有对应缓存文件真实存在时才触发重写逻辑,避免缓存不存在时错误清空查询参数 - 最终回退到
index.php的规则新增QSA标记,确保原始请求的查询参数会完整传递给PHP后端 - 调整规则优先级,把匹配范围更小的首页规则前置,避免被后续通用规则误匹配
内容的提问来源于stack exchange,提问作者remi
相关产品推荐
相关产品推荐

