You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:45:03