.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-Agent
和 Cookie
header,因此也应将这些添加到 Vary
header 以确保来自任何中介的适当缓存。比如在上面的后面添加:
Header always merge Vary "User-Agent, Cookie"
我有简单的代码来检查我的旧网站上的用户是否使用移动设备。如果使用则重定向到新站点和带有变量的移动版本。但同时我想检查用户是否是桌面用户并重定向到其他站点。
我的代码是:
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-Agent
和 Cookie
header,因此也应将这些添加到 Vary
header 以确保来自任何中介的适当缓存。比如在上面的后面添加:
Header always merge Vary "User-Agent, Cookie"