htaccess设置cookie然后在同一行使用跳过规则标志

时间:2014-06-24 12:29:05

标签: apache .htaccess mod-rewrite cookies url-rewriting

我正在编写一些代码,重定向到网站的移动版本,除非已经设置了cookie。

移动网站上有一个链接,"转到桌面网站"。它的目标是具有GET变量的桌面站点," noredirect = 1"。

以下是桌面网站上根.htaccess文件中的代码。它检查GET变量,然后设置一个cookie(如果存在),然后跳过下一个规则。

# Check if this is the noredirect query string
RewriteCond %{QUERY_STRING} (^|&)noredirect=1(&|$)

# Set a cookie to say we want to stay on the desktop site 
# and skip the next rule so 
# that the below mobile rule does not redirect 
# (cookie cannot be set AND read in one request)
RewriteRule ^ - [CO=mredir:1:%{HTTP_HOST},S=1]

跳过标志似乎不起作用。在这段代码下面,我有一些RewriteConds和一个RewriteRule:

# Check to make sure we haven't set the cookie before
RewriteCond %{HTTP:Cookie}     !\smredir=1(;|$)
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|iphone|ipod|iemobile|opera|mobile|palmos|webos|googlebot-mobile" [NC,OR]
RewriteCond %{HTTP:Profile} !^$
RewriteCond %{HTTP_HOST} ^(?:www\.)?((?!www\.)[^.]+)\.([^.]+\.[^.]+)$ [NC]
RewriteRule ^$ http://m.%1.%2 [L,R]

当下一条规则前面有条件时,跳过标志是否仍然有效?

另外,我的主要问题是:跳过标记的语法是否正确,是否可以在设置cookie的同一行中完成?

我已尝试过这两种组合:

RewriteRule ^ - [CO=mredir:1:%{HTTP_HOST},S=1]

RewriteRule ^ - [CO=mredir:1:%{HTTP_HOST}] [S=1]

既不会出现任何错误,但跳过标记仍无效。

帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

有关如何解决此问题的一般提示,请参阅我的Tips for debugging .htaccess rewrite rules。您还需要区分响应cookie(输出)和请求cookie(输入)。 CO标志设置了响应cookie,但在当前传递中%{HTTP:Cookie}中不一定可见。正确使用跳过链或者也设置环境变量并使用它,因为它立即可见。