如何在同一.htaccess文件中配置移动端与桌面端分别跳转的规则
调整方案
你只需要把桌面端跳转规则直接放在现有所有规则的末尾即可,完整配置如下:
RewriteEngine On # 处理query string里的mobile参数,设置对应cookie RewriteCond %{QUERY_STRING} (^|&)mobile=1(&|$) RewriteRule ^ - [CO=mobile:1:%{HTTP_HOST}] RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$) RewriteRule ^ - [CO=mobile:0:%{HTTP_HOST}] # 当query string带mobile=0时,跳过下面的移动端检测规则 RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$) RewriteRule ^ - [S=1] # 移动端检测逻辑,命中则跳移动端站点,L标记表示命中后终止后续规则 RewriteCond %{HTTP:x-wap-profile} !^$ [OR] RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC,OR] RewriteCond %{HTTP:Profile} !^$ RewriteCond %{HTTP_HOST} !^m\. RewriteCond %{HTTP:Cookie} !\mobile=0(;|$) RewriteRule ^(.*)$ https://m.somesite.com/$1 [R=301,L] # 桌面端跳转规则:未命中移动端跳转的请求都会走到这里,跳桌面站点 RewriteRule ^(.*)$ https://desktop.othersomesite.com/$1 [R=301,L]
逻辑说明
- 原有移动端跳转规则末尾的
[L]标记会让命中移动端判断的请求直接跳转,不再执行后面的规则,刚好匹配你要的if(移动端)分支逻辑 - 没有命中移动端跳转的请求,会自然落到末尾的桌面端跳转规则执行,对应你的
elseif(桌面端)分支逻辑 - 原有用户手动指定
mobile=0强制跳桌面端的逻辑不受影响,符合需求
如果你有需要排除不跳转的路径/请求,可以在桌面端跳转规则前面加对应的RewriteCond条件过滤即可,比如要排除/api开头的接口请求不跳转,就加:
RewriteCond %{REQUEST_URI} !^/api
到桌面端RewriteRule的前面就行。
内容的提问来源于stack exchange,提问作者Karmay
相关产品推荐
相关产品推荐

