为了给出背景,目标是:
使用apache httpd我需要测试请求的上下文段uri包含在标头中发送的cookie值中,然后将用户重定向到启动页面以进行cookie确认,或允许他们访问该站点。
鉴于以下内容:
url:http://www.example.com/en/gb/main.html
cookie:; acceptedCookies = fr,en,de,it
如果url =“en”的语言段,则这是用户接受的Cookie之一。然后允许用户访问主站点,否则将用户重定向到启动页面。
我尝试过的:
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解决方案来解决这个问题
所有这一切,考虑如下:
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]
以下@Avi解决方案将起作用,但任何允许客户端值未知的执行验证的解决方案都存在根本缺陷,从而存在超出缓冲区和DOS的潜在风险。