我正在尝试根据 cookie 值控制 apache,但似乎无法使用SetEnvIf
。HTTP_COOKIE
我将其归结为一些简单的逻辑,以隔离问题并易于测试。
Ubuntu 12.04.1 LTS 上的 Apache 2.2.22。
我正在使用的是:
Header set Set-Cookie "cookie1=1"
SetEnvIf HTTP_COOKIE "cookie1=1" is_cookie1
Header set Set-Cookie "cookie2=2" env=is_cookie1
使用 Chrome 的资源选项卡,我正在检查该页面的 cookie。我希望看到以下内容:
- 首次页面加载,
cookie1=1
存在 - 第二页(及后续页面)加载
cookie1=1
并cookie2=2
存在。
相反,我得到的只是cookie1
:
如果我添加以下行:
SetEnvIf Remote_Addr ^192\.168\. is_cookie1
然后cookie2
立即设置,正如我所料,所以最后Header ... env=is_cookie1
一行看起来没问题。
我还尝试验证 HTTP_COOKIE 是否设置正确:
RewriteRule ^/test/$ /test/%{HTTP_COOKIE} [R=302,L]
现在将/test/
立即重定向到/test/cookie1=1%3b%20cookie2=2
我所期望的位置,因此HTTP_COOKIE
似乎设置正确。
我也尝试了许多 SetEnvIf 的变体,但似乎都没有用:
SetEnvIf HTTP_COOKIE "^cookie1=1$" is_cookie1
SetEnvIf HTTP_COOKIE ^cookie1=1$ is_cookie1
SetEnvIf HTTP_COOKIE "^.+$" is_cookie1
SetEnvIf HTTP_COOKIE ^.+$ is_cookie1
..虽然
SetEnvIf HTTP_COOKIE ^.*$ is_cookie1
在任何情况下立即设置 cookie2(第一次加载时)(这……根本没有用。但至少它告诉我这一行确实某物)。
我究竟做错了什么?
答案1
我遇到了同样的问题,并且这个页面位于 Google 的顶部,apache setenvif cookie
所以我想分享我如何解决这个问题。
我能够通过使用变量Cookie
而不是HTTP_COOKIE
变量来匹配 cookie,即
SetEnvIf Cookie "cookie1=1" is_cookie1
答案2
我不知道这是否能解决你的问题,但我可以提供两点:
预感即使你已经订购了指令正确地[Header ... SetEnvIf ... Header ...],处理相关的顺序模块提供这些指令可能会使它们的相互作用成为一个问题。这表明可能值得尝试另一种攻击角度。
一种不同的 cookie 设置机制可能会有所帮助:尝试使用 mod_rewrite RewriteRule,它实际上并不路由请求(请注意“-”目标),而只是设置一个 cookie:
重写规则 ^/index.html - [CO=cookiename:cookieval:.example.com:1440:/]
您可以添加 RewriteCond 来检查环境变量,从而有条件地设置 cookie,如下所示:
RewriteCond %{ENV:VARNAME} value
RewriteRule ^/index\.html - [CO=cookiename:cookieval:.example.com:1440:/]
它甚至可能满足您的要求,完全跳过设置环境变量,仅根据第一个 cookie 的存在来设置第二个 cookie,将所有逻辑保留在 mod_rewrite 中:
RewriteCond %{HTTP_COOKIE} cookie1
RewriteRule ^/index\.html - [CO=cookie2:2:.example.com:1440:/]
哈哈哈!:) 克里斯