.htaccess根据设备类型跳转加载桌面/移动端对应站点目录问题
错误原因排查
你写的合并规则存在3个核心问题,直接导致报错和逻辑失效:
- 规则逻辑完全颠倒:
RewriteCond仅对紧随其后的第一条RewriteRule生效,你写的设备匹配条件仅作用于RewriteRule . - [S=1]这条,且[S=1]代表匹配到条件时跳过后面1条规则,等于移动设备反而会命中桌面端目录规则 - 缺少[L]标记:所有路径重写规则没有加[L]标记,触发重写循环,返回500错误
- 存在性判断规则无效:你写的
%{SCRIPT_FILENAME}判断放在独立的IfModule块中,没有关联到任何重写规则,等于完全没有生效,会导致真实存在的静态资源也被重写,触发403错误
修正后的完整.htaccess规则
<IfModule mime_module> AddHandler application/x-httpd-ea-php73 .php .php7 .phtml </IfModule> Options +FollowSymLinks RewriteEngine On # 根地址默认跳转/home RewriteRule ^$ /home [L] # 跳过真实存在的文件/目录的重写 RewriteCond %{SCRIPT_FILENAME} -d [OR] RewriteCond %{SCRIPT_FILENAME} -f RewriteRule ^ - [L] # 移动设备匹配:命中则重写到mobile目录 RewriteCond %{HTTP_ACCEPT} "text\/vnd\.wap\.wml|application\/vnd\.wap\.xhtml\+xml" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "mini|nitro|j2me|midp-|cldc-|netfront|mot|up\.browser|up\.link|audiovox" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "blackberry|ericsson,|panasonic|philips|sanyo|sharp|sie" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "portalmmm|blazer|avantgo|danger|palm|series60|palmsource|pocketpc" [NC,OR] RewriteCond %{HTTP_USER_AGENT} "smartphone|rover|ipaq|au-mic,|alcatel|ericy|vodafone\/|wap1\.|wap2\.|iPhone|android" [NC] RewriteRule ^(.+)$ /Pages/mobile/$1 [L] # 未匹配到移动设备默认走桌面端目录 RewriteRule ^(.+)$ /Pages/desktop/$1 [L]
规则说明
- 优先处理根路径跳转,保证访问根域名时直接加载/home内容,URL保持干净
- 增加真实文件/目录的跳过规则,保证静态资源、上传文件等可以正常访问,不会被重写
- 移动设备匹配条件直接关联mobile目录重写规则,命中后直接执行重写并结束规则匹配
- 所有重写规则都加了[L]标记,避免规则循环执行
- 未命中移动设备判断的请求,默认走桌面端目录重写,逻辑清晰无冲突
后续需要新增平板设备适配时,只需要在移动设备规则和桌面端规则之间插入平板的UA判断规则即可,三类设备的适配逻辑完全独立不会互相干扰。
内容的提问来源于stack exchange,提问作者Chris Orea
相关产品推荐
相关产品推荐

