【问题标题】:htaccess compare cookie value and redirect if evaluation returns true/falsehtaccess 比较 cookie 值并在评估返回 true/false 时重定向
【发布时间】:2013-10-15 13:12:01
【问题描述】:

我希望有人帮助我在 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.
}

【问题讨论】:

  • @mavrosxristoforos。它不是重复的,因为我实际上是在尝试比较这些值而不仅仅是检查 cookie 是否设置。我发布的 htaccess 的代码已经做到了。

标签: regex apache .htaccess mod-rewrite cookies


【解决方案1】:

你已经接近了。 cookie 字符串需要=:

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

【讨论】:

  • 对于单个或多个 cookie 应该有模式 ;? 如果站点上存在单个 Cookie,则该模式将不起作用。更新的解决方案完成了这项工作:RewriteEngine On RewriteCond %{HTTP_COOKIE} !cookie_name=specific_value;? [NC] RewriteRule ^ http://www.google.com [NC,L]
【解决方案2】:

required_value替换为需要匹配的值。

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

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

【讨论】:

  • 是的,对于单个或多个 cookie,应该有模式 ;?
【解决方案3】:

您可以使用以下代码检查 cookie 中的特定值:

RewriteEngine On

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

【讨论】:

    【解决方案4】:

    %{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,则搜索可能会失败。它们都是有效的。

    【讨论】:

      猜你喜欢
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多