【问题标题】:.htaccess redirect to mobile and desktop in one file.htaccess 在一个文件中重定向到移动设备和桌面
【发布时间】:2026-01-06 20:25:01
【问题描述】:

我有简单的代码来检查我的旧网站上的用户是否使用移动设备。如果使用,则使用变量重定向到新站点和移动版本。但同时我想检查用户是否是桌面并重定向到其他站点。

我的代码是:

RewriteEngine On

RewriteCond %{QUERY_STRING} (^|&)mobile=1(&|$)
RewriteRule ^ - [CO=mobile:1:%{HTTP_HOST}]
RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$)
RewriteRule ^ - [CO=mobile:0:%{HTTP_HOST}]
RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$)
RewriteRule ^ - [S=1]
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]

类似的东西

<?php
...

if ($mobile = 1) {
  header('Location: https://m.somesite.com/$1');
} 
elseif ($mobile = 0) {
  header('Location: https://desktop.othersomesite.com/$1');;
}
?>

谢谢:)

【问题讨论】:

    标签: php apache .htaccess


    【解决方案1】:

    ...如果用户是桌面,我可以在哪里放置带有变量的特殊重定向?

    RewriteRule ^(.*)$ https://desktop.othersomesite.com/$1 [R=301,L]
    

    看起来您可以将其立即放在您现有的指令(重定向到移动网站)之后。

    类似的东西

    <?php
    

    我不太确定你想在这里展示什么,除了可能试图展示逻辑?但这似乎具有误导性,因为我不相信您想在 PHP 中实现它;你? PHP 也是无效的(关键是使用赋值运算符,而不是检查相等性)。


    但是,关于您现有指令的一些注意事项...

    RewriteCond %{QUERY_STRING} (^|&)mobile=1(&|$)
    RewriteRule ^ - [CO=mobile:1:%{HTTP_HOST}]
    RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$)
    RewriteRule ^ - [CO=mobile:0:%{HTTP_HOST}]
    RewriteCond %{QUERY_STRING} (^|&)mobile=0(&|$)
    RewriteRule ^ - [S=1]
    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]
    

    前两个规则(设置mobile cookie)可以合并为一个。第三条规则可以转换为单个RewriteCond 指令,用于随后的主规则。

    有一个HTTP_COOKIE 服务器变量,所以我倾向于使用它而不是HTTP:Cookie(直接访问标题)。最后一个 CondPattern 中的 \m 看起来像一个错误 - 尽管它仍然与文字 m 匹配,因此它“有效”。但是,这也匹配任何名称​​以“mobile”结尾的cookie,而不仅仅是mobile。正则表达式需要像 (^|;|\s)mobile=0(;|$) 这样的东西,因为 cookie 名称=值对通常;&lt;space&gt; 分隔。

    所以,将这些点放在一起,我们有:

    # Set mobile cookie if mobile present in query string
    RewriteCond %{QUERY_STRING} (?:^|&)mobile=(0|1)(?:&|$)
    RewriteRule ^ - [CO=mobile:%1:%{HTTP_HOST}]
    
    # Mobile
    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 %{QUERY_STRING}       !(^|&)mobile=0(&|$)
    RewriteCond %{HTTP_COOKIE}        !(^|;|\s)mobile=0(;|$)
    RewriteRule (.*) https://m.somesite.com/$1 [R=301,L]
    
    # Else Desktop
    RewriteRule (.*) https://desktop.othersomesite.com/$1 [R=301,L]
    

    此外,由于您可能基于 User-AgentCookie 标头进行重定向,因此还应将它们添加到 Vary 标头中,以确保来自任何中介的正确缓存。例如,在上面添加以下内容:

    Header always merge Vary "User-Agent, Cookie"
    

    【讨论】:

      最近更新 更多