我希望有人能帮助我在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.
}
答案 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,则搜索可能会失败。它们都有效。