如何将 Apache SetEnvIf 与 cookie 值结合使用?

gre*_*mac 5 apache-2.2

我试图根据 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
Run Code Online (Sandbox Code Playgroud)

使用 Chrome 的资源选项卡,我正在检查页面的 cookie。我期望看到的是:

  • 第一页加载,cookie1=1存在
  • 第二个(及后续)页面加载cookie1=1cookie2=2存在。

相反,我得到的只是cookie1

Chrome cookie 检查器


如果我添加以下行:

     SetEnvIf Remote_Addr ^192\.168\. is_cookie1
Run Code Online (Sandbox Code Playgroud)

正如我所期望的那样,然后cookie2立即设置,所以最后Header ... env=is_cookie1一行似乎没问题。


我还尝试验证 HTTP_COOKIE 是否设置正确:

     RewriteRule ^/test/$ /test/%{HTTP_COOKIE} [R=302,L]
Run Code Online (Sandbox Code Playgroud)

现在将/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
Run Code Online (Sandbox Code Playgroud)

..虽然

     SetEnvIf HTTP_COOKIE ^.*$ is_cookie1
Run Code Online (Sandbox Code Playgroud)

在任何情况下立即设置 cookie2 (在第一次加载时)(这......根本没有用。但至少它告诉我这条线做了一些事情)。


我究竟做错了什么?

小智 0

我不知道这是否能解决你的问题,但我可以提供两件事:

  1. 预感即使您已正确订购指令[Header...SetEnvIf...Header...],提供这些指令的相关模块的处理顺序可能会使它们的相互作用成为问题。这表明替代的攻击角度可能值得尝试。

  2. cookie 设置的不同机制可能会有所帮助:尝试使用 mod_rewrite RewriteRule ,它实际上并不路由请求(注意“-”目标),而只是设置一个 cookie:

    RewriteRule ^/index.html - [CO=cookiename:cookieval:.example.com:1440:/]

您可以添加 RewriteCond 来检查环境变量,从而有条件地设置 cookie,如下所示:

RewriteCond %{ENV:VARNAME} value
RewriteRule ^/index\.html - [CO=cookiename:cookieval:.example.com:1440:/]
Run Code Online (Sandbox Code Playgroud)

它甚至可能满足您的要求,完全跳过设置环境变量,只根据第一个 cookie 的存在设置第二个 cookie,将所有逻辑保留在 mod_rewrite 中:

RewriteCond %{HTTP_COOKIE} cookie1
RewriteRule ^/index\.html - [CO=cookie2:2:.example.com:1440:/]
Run Code Online (Sandbox Code Playgroud)

哈!:) 克里斯