Как написать IF содержит условие, соответствующее 2 переменным ENV, установленным через RewriteRules - PullRequest
0 голосов
/ 21 февраля 2019

Чтобы дать контекст, цель:

При использовании apache httpd мне нужно проверить контекстный сегмент запроса uri, который содержится в значении cookie, отправляемом в заголовке, прежде чем перенаправить пользователя на страницу-заставку для cookieподтверждение или предоставление им доступа к сайту.

С учетом следующего:

url: http://www.example.com/en/gb/main.html

cookie: ; acceptCookies = fr, en, de, it

Если языковой сегмент url = "en", и это входит в число принятых пользователями Cookies.Затем разрешите пользователю доступ к основному сайту, иначе перенаправьте пользователя на заставку.

Что я пробовал:

SetEnvIf Host ^ uriCountryCode=NUL
SetEnvIfNoCase Request_URI "^(.+)?\/([a-zA-Z]{2})\/[a-zA-Z]{2}\/.+$" uriCountryCode=$2

SetEnvIf Host ^ acceptedCookieList=EMP 
SetEnvIf Cookie "(^|;\*)acceptedCookies=([^;]+)?" acceptedCookieList=$2
#1st.
<If "%{acceptedCookieList} =~ %{uriCountryCode}">
// Doesn't work
</If>

#2nd.
<If "env('acceptedCookieList') =~ env('uriCountryCode')">
// No luck
</If>

#3rd.
<If "env('acceptedCookieList') =~ /env('uriCountryCode')/">
// Now I'm just guessing
</If>

#4th.
RewriteCond %{acceptedCookieList} !%{uriCountryCode}
RewriteCond %{REQUEST_URI} !^/en/gb/splash.html$ [NC]
RewriteRule ^(.+)$ /mt/en/splash [L,R=301]

Недавно я узнал, что некоторые из этих модулей, например, env ('x ') не будет загружать переменные SetEnvIf из-за переменных SetEnvIf, загружаемых недостаточно рано, чтобы быть доступными, но я пытаюсь найти решение httpd для этой моей проблемы

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Следующее решение @Avi будет работать, но любое решение, позволяющее на стороне клиента значения неизвестной длины для выполнения проверки, в корне ошибочно, что создает потенциальный риск превышения буферов и DOS.

0 голосов
/ 24 февраля 2019
  1. mod_rewrite может установить переменные среды .
  2. Использовать 302 перенаправление (временно перемещено) вместо 301 перенаправления (Перемещено безвозвратно).
  3. Сопоставление с произвольным регулярным выражением, предоставленным клиентом (т. Е. Содержимым файла cookie acceptCookies) опасно.Тем не менее, httpd expression язык не имеет встроенной функции «содержит», и поэтому неясно, как избежать соответствия регулярному выражению.Это сделает ваш сервер (-ы) восприимчивым к DoS-атакам .

Все это говорит о следующем:

RewriteCond %{HTTP_COOKIE} acceptedCookies=([^;]+)
RewriteRule ^.*$ - [E=COOKIE_ACCEPTED_LANGS:%1]

RewriteCond %{REQUEST_URI} ^/([^/]+)/.*$
RewriteRule ^.*$ - [E=URL_LANG:%1]

RewriteCond expr %{ENV:URL_LANG} =~ %{ENV:COOKIE_ACCEPTED_LANGS}
RewriteCond %{REQUEST_URI} !^/en/gb/splash.html$ [NC]
RewriteRule ^.*$ /mt/en/splash [R]
...