.htaccess 在一个文件中重定向到移动设备和桌面

.htaccess redirect to mobile and desktop in one file

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

我的代码是:

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/ [R=301,L]

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

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

像这样

<?php
...

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

谢谢:)

...where i can put special redirect with variable if user are desktop?

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

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

something like this

<?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/ [R=301,L]

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

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

分隔

因此,将这些点放在一起我们有:

# 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/ [R=301,L]

# Else Desktop
RewriteRule (.*) https://desktop.othersomesite.com/ [R=301,L]

此外,由于您可能将重定向基于 User-AgentCookie header,因此也应将这些添加到 Vary header 以确保来自任何中介的适当缓存。比如在上面的后面添加:

Header always merge Vary "User-Agent, Cookie"