如果评估返回true / false,则htaccess比较cookie值并重定向

时间:2013-10-15 13:12:01

标签: regex apache .htaccess mod-rewrite cookies

我希望有人能帮助我在htaccess中使用if-else语句。我想要的是htaccess读取cookie并检查其值是否等于定义的值。如果它的计算结果为false,则应该执行重定向并阻止访问所请求的文件夹。如果评估结果为假,那么拒绝所有人会更好。

我知道以下代码检查是否设置了命名的cookie值。如果未设置,它将在其下面执行重写规则。但是如何调整此行以便检查它是否等于某个值?

RewriteEngine On
RewriteCond %{HTTP_COOKIE} !^.*cookie_name.*$ [NC]
RewriteRule .* http://www.google.com [NC,L]

我想要什么,但是.htaccess风格:

if ($_COOKIE['cookie_name'] != 'specific_value'){
//rewrite_rule or deny from all.
}

4 个答案:

答案 0 :(得分:15)

你很亲密。 Cookie字符串需要=

RewriteEngine On
RewriteCond %{HTTP_COOKIE} !cookie_name=specific_value; [NC]
RewriteRule ^ http://www.google.com [NC,L]

答案 1 :(得分:7)

required_value替换为需要匹配的值。

RewriteEngine On
RewriteCond %{HTTP_COOKIE} !cookie_name=required_value;? [NC]
RewriteRule ^ http://www.google.com [R=301,L]

;?确保在有多个Cookie值对或cookie_name是唯一的Cookie集时发生匹配。当仅需要off(子字符串)匹配时,这也会阻止匹配像of这样的cookie值。

答案 2 :(得分:1)

您可以使用此代码检查Cookie中的特定值:

RewriteEngine On

RewriteCond %{HTTP_COOKIE} !cookie_name=specific_value [NC]
RewriteRule ^ http://www.google.com [NC,L,R=302]

答案 3 :(得分:0)

%{HTTP_COOKIE}字符串看起来像一系列由分号分隔的转义的名称/值对,每个分号后跟一个空格。来自MDN

语法

Cookie: <cookie-list>
Cookie: name=value
Cookie: name=value; name2=value2; name3=value3

  • =形式的名称-值对列表。列表中的对以分号和空格(';')分隔。

示例

Cookie: PHPSESSID=298zf09hf012fh2; csrftoken=u32t4o3tb3gg43; _gat=1

因此,在您的正则表达式中,您需要有选择地匹配分号,后跟一个空格,并在末尾匹配一个分号,如下所示:

RewriteCond %{HTTP_COOKIE} "!(?:^|; )cookie_name=specific_value(?:;|$)"

注意:不同的set-cookie函数会转义不同的字符。因此,尽管一个函数可能会转义@符号,但另一个函数可能不会导致cookie字符串的外观不一致。例如,如果将useremail@gmail.com存储为useremail%40gmail.com,则搜索可能会失败。它们都有效。