LiteSpeed服务器下htaccess重写规则实现移动适配不生效问题求助
问题根因
LiteSpeed 与 Apache 的重写规则执行逻辑存在核心差异:Apache 中 [L] 标记仅终止当前轮次的重写,重写后的 URI 会重新进入全局重写流程再次匹配所有规则;而 LiteSpeed 默认配置下 [L] 标记会直接终止全部重写流程,不会触发二次匹配。
你原有规则在 Apache 下的正常执行流程为:
- 移动端用户请求
/category1.htm,第一轮匹配伪静态规则,重写为/index.php?cPath=1,[L]结束第一轮 - 重写后的 URI
/index.php进入第二轮重写,匹配移动端规则,重写为/index_mob.php
迁移到 LiteSpeed 后,第一步重写完成后触发[L]直接终止流程,移动端规则永远无法匹配到内部重写后的index.php请求,因此出现异常。
解决方案(按优先度排序)
方案1:开启LiteSpeed Apache重写兼容性(最推荐)
直接在LiteSpeed管理面板或虚拟主机配置中开启「Apache Rewrite Compatibility」(重写兼容性)选项,开启后[L]标记的行为会和Apache完全一致,原有规则不需要做任何修改即可正常运行。
方案2:修改伪静态规则标记适配LiteSpeed
如果无法修改服务器全局配置,可将所有内部重写的伪静态规则的[L,QSA]标记替换为[PT,QSA],PT(Pass Through)标记会通知LiteSpeed将重写后的URI重新传入重写流程进行二次匹配,原有移动端规则无需调整,修改后的伪静态规则示例:
RewriteCond %{REQUEST_URI} ^/category1\.htm RewriteRule ^.*$ /index.php?cPath=1 [PT,QSA]
注意:所有内部重写规则(包括站点根目录默认重写为index.php的规则)都需要将L替换为PT
方案3:追加规则覆盖重写后场景
如果上述方案都不可用,可在现有所有规则的末尾追加一条专门适配内部重写index.php的移动端规则,不需要修改原有规则的标记:
RewriteCond %{HTTP_USER_AGENT} "Mobile" RewriteCond %{REQUEST_URI} "^/index.php" RewriteRule ^(.*).php$ /$1_mob.php [L,QSA]
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

