【问题标题】:Apache Rewrite rules: How to check for host name in cookies?Apache 重写规则:如何检查 cookie 中的主机名?
【发布时间】:2014-09-25 19:49:48
【问题描述】:

我正在使用重写规则设置一个 cookie,这是有效的(为简洁起见进行了简化):

RewriteCond %{QUERY_STRING} set_cookie=1 [NC]
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}?skip=1 [QSA,NE,NC,L,CO=test_%{HTTP_HOST}:tmp:%{HTTP_HOST}:5:/]

这个设置了一个名为 test_{host_name} 的 cookie。现在我想在下一个请求中读取该 cookie 值。我试过这个(和一些变种),但这似乎不起作用。

RewriteCond %{QUERY_STRING} skip [NC]
RewriteCond %{HTTP_COOKIE} ^.*test_%{HTTP_HOST}=tmp.*$ [NC] 
RewriteRule ^(.*)$ - [L]

当我在谷歌上搜索时,我 found an article 声明如下:

如果您想知道,“为什么不使用 %{HTTP_HOST} 而不是 corz.org, 创建通用代码?”,据我所知,无法测试 一个服务器变量对另一个服务器变量使用 RewriteCond 而不使用 原子反向引用和一些严肃的 POSIX 1003.2+ Jiggery-Pokery。

我想这是我的问题,但我不知道如何解决它。非常感谢任何帮助。

问候, 约斯特。

【问题讨论】:

    标签: apache mod-rewrite cookies


    【解决方案1】:

    在这方面有一个有用的技巧。它是简单的正则表达式,但却是一种独特的 mod_rewrite 风格。

    请注意,我对这里的匹配不太小心,尤其是在第一个条件下——这是为了说明第二个条件:

    RewriteEngine ON
    RewriteCond %{HTTP_COOKIE} test_([^;]*)=tmp.*$
    RewriteCond %1<>%{HTTP_HOST} ^(.+)<>\1
    RewriteRule .* - [F]
    

    新颖的部分(对于 mod_rewrite)是您只能在第一个参数中使用变量/反向引用,但您可以在第二个参数中使用反向引用(对于当前表达式,而不是前一个)。

    小只是不太可能作为分隔符出现的东西。

    【讨论】:

    • 为什么是 [F] 而不是 [L]?
    • 这不会破坏多个名称部分相同的 cookie 吗?例如subdomain.com 和 domain.com cookie 都在 subdomain.com 上可用?那么名为 test_subdomain.domain.com 和 test_domain.com 的 cookie 具有不同的值?
    • 我无法让它工作。我真的需要能够检查确切的 cookie 名称,因为可能存在多个。我还需要能够检查是否缺少 cookie...
    【解决方案2】:

    我找到了解决办法。这部分在我原来的问题中

    RewriteCond %{QUERY_STRING} skip [NC]
    RewriteCond %{HTTP_COOKIE} ^.*test_%{HTTP_HOST}=tmp.*$ [NC] 
    RewriteRule ^(.*)$ - [L]
    

    应替换为以下内容

    RewriteCond %{QUERY_STRING} skip [NC]
    RewriteCond %{HTTP_HOST}@@%{HTTP_COOKIE} ^([^@]*)@@.*test_\1=tmp.* [NC]
    RewriteRule ^(.*)$ - [L]
    

    只有第二个 RewriteCond 发生了变化。它的左侧 (%{HTTP_HOST}@@%{HTTP_COOKIE}) 连接 http 主机和 cookie 值,使用 @@ 作为胶水(@@ 并不真正意味着什么,它不太可能用于普通主机或 cookie 字符串)。

    右侧 (^([^@]*)@@.*test_\1=tmp.*) 将所有内容与第一个“@”(即主机名)匹配,然后检查是否可以在 cookie 值中的某个位置找到它,前面是“test_”,后面是“ =tmp”。

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      相关资源
      最近更新 更多