Как вы используете 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
:
Если я добавлю строку:
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 вещи:
догадка, что даже если вы правильно упорядочили директивы [Header... SetEnvIf... Header...], порядок обработки соответствующих модулей, обеспечивающих эти директивы, может сделать их взаимодействие проблематичным. Что предполагает альтернативный угол атаки, возможно, стоит попробовать.
другой механизм настройки 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:/]
НТН!:) Крис