通过.htaccess实现移动端重定向到子目录及全站HTTPS跳转
解决.htaccess同时实现HTTPS www跳转与移动端子目录重定向的方案
搞定这个问题不难,关键是要把规则顺序和防循环的逻辑理清楚。我给你一套经过验证的.htaccess配置方案,既能实现HTTPS www的强制跳转,又能把移动端用户导向/mobile子目录,还不会出现循环跳转的坑:
核心思路
先统一将所有请求强制跳转至https://www.example.com(覆盖http、非www的https场景),再针对移动端用户,在未访问/mobile子目录的前提下,重定向到对应子目录。这样就能从根源避免循环问题。
完整的.htaccess配置代码
# 启用重写引擎 RewriteEngine On # 1. 强制跳转至HTTPS + www域名 RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L] # 2. 移动端用户重定向至/mobile子目录(避免循环) # 检测常见移动端用户代理 RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipad|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC] # 排除已经在/mobile目录下的请求 RewriteCond %{REQUEST_URI} !^/mobile/ [NC] # 重定向到/mobile子目录并保留原请求路径(不需要保留可改为^ /mobile/ [R=301,L]) RewriteRule ^(.*)$ /mobile/$1 [R=301,L]
逐行规则解释
强制HTTPS + www规则
RewriteEngine On:开启Apache的URL重写功能,是所有规则生效的前提。RewriteCond %{HTTP_HOST} !^www\. [NC]:匹配所有非www开头的域名(NC表示忽略大小写)。RewriteCond %{HTTPS}s ^on(s)|:这是个巧妙的写法,同时兼容http和https场景:如果当前是HTTPS,%{HTTPS}值为on,拼接后是ons匹配规则;如果是HTTP,%{HTTPS}为空,拼接后是s匹配规则后半段,确保无论是否HTTPS,只要域名不是www就执行跳转。RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]:将请求永久重定向(301利于SEO)到目标域名,同时保留原请求路径(比如http://example.com/about会跳转到https://www.example.com/about)。L表示匹配后结束当前规则循环,跳转后新请求会重新进入规则判断。
移动端重定向规则
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipad|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]:匹配常见的移动端用户代理,你可以根据需求增减UA关键字。RewriteCond %{REQUEST_URI} !^/mobile/ [NC]:最关键的防循环逻辑!排除已经在/mobile子目录的请求,这样用户被跳转后再次请求时,这条条件不满足,就不会重复跳转。RewriteRule ^(.*)$ /mobile/$1 [R=301,L]:保留原请求路径的跳转(比如https://www.example.com/product/123会跳转到https://www.example.com/mobile/product/123);如果只想跳转到/mobile首页,可改为RewriteRule ^ /mobile/ [R=301,L]。
注意事项
- 测试阶段建议先用
R=302临时重定向,确认规则无误后再改为R=301永久重定向,避免浏览器缓存错误的跳转规则。 - 确保你的服务器支持.htaccess,并且已启用
mod_rewrite模块。 - 如果网站已有其他重写规则(比如WordPress固定链接),请将这套规则放在所有规则的上方,因为规则是从上到下执行的。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

