我试图控制基于Cookie值的Apache,但我似乎无法得到SetEnvIf与HTTP_COOKIE工作。 我已经把这个简单的逻辑来解决问题,并容易testing。
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线似乎是罚款。
我也尝试validationHTTP_COOKIE是否正确设置:
RewriteRule ^/test/$ /test/%{HTTP_COOKIE} [R=302,L]
现在去/test/立即redirect到/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(这根本没有用,但至less它告诉我这行代码有用)。
我究竟做错了什么?
我面临着同样的问题,这个页面出现在谷歌的顶部,用于apache setenvif cookie所以我想我会分享我如何解决这个问题。
我能够通过使用Cookievariables而不是HTTP_COOKIEvariables来匹配Cookie
SetEnvIf Cookie "cookie1=1" is_cookie1
我不知道这是否能解决你的问题,但我可以提供两件事情:
一个预感,即使你已经正确地命令了指令 [Header … SetEnvIf … Header …],提供这些指令的相关模块的处理顺序可能使得它们的相互作用成为一个问题。 这表明一个替代的攻击angular度可能值得尝试。
一个不同的cookie设置机制可能有助于:尝试使用mod_rewrite的RewriteRule,它实际上并不会路由请求(注意“ – ”目标),而只是设置一个cookie:
RewriteRule ^ / index.html – [CO = cookiename:cookieval:.example.com:1440:/]
你可以添加一个RewriteCond来检查env var,从而有条件地设置这样的cookie:
RewriteCond %{ENV:VARNAME} value RewriteRule ^/index\.html - [CO=cookiename:cookieval:.example.com:1440:/]
它甚至可以满足你的要求,完全不用设置envvariables,只需要根据第一个variables的存在来设置第二个cookie,保持mod_rewrite中的所有逻辑:
RewriteCond %{HTTP_COOKIE} cookie1 RewriteRule ^/index\.html - [CO=cookie2:2:.example.com:1440:/]
HTH! :) 克里斯