Как вы используете Apache SetEnvIf со значениями cookie?

Я пытаюсь контролировать Apache на основе значений cookie, но я не могу получить SetEnvIf работать с HTTP_COOKIE, Я свел это к некоторой простой логике, чтобы изолировать проблему и было легко проверить.

Apache 2.2.22 на Ubuntu 12.04.1 LTS.


Я использую это:

     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:

Chrome cookie контролер


Если я добавлю строку:

     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 немедленно (при первой загрузке) в любой ситуации (что... бесполезно. но, по крайней мере, говорит, что эта строка что- то делает).


Что я делаю неправильно?

2 ответа

Я столкнулся с той же проблемой, и эта страница находится в верхней части Google для apache setenvif cookie поэтому я думал, что поделюсь, как я это исправил.

Я смог сопоставить файлы cookie с помощью Cookie переменная, а не HTTP_COOKIE переменная, т.е.

SetEnvIf Cookie "cookie1=1" is_cookie1

Я не знаю, решит ли это вашу проблему, но я могу предложить 2 вещи:

  1. догадка, что даже если вы правильно упорядочили директивы [Header... SetEnvIf... Header...], порядок обработки соответствующих модулей, обеспечивающих эти директивы, может сделать их взаимодействие проблематичным. Что предполагает альтернативный угол атаки, возможно, стоит попробовать.

  2. другой механизм настройки 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:/]

Это может даже удовлетворить ваши требования, чтобы вообще пропустить установку переменных env и просто установить второй cookie в зависимости от наличия первого, сохраняя всю логику в mod_rewrite:

RewriteCond %{HTTP_COOKIE} cookie1
RewriteRule ^/index\.html - [CO=cookie2:2:.example.com:1440:/]

НТН!:) Крис

Другие вопросы по тегам