Apache Rewrite规则:如何检查cookie中的主机名?

时间:2014-09-25 19:49:48

标签: apache mod-rewrite cookies

我正在使用重写规则设置一个cookie,这是有效的(简化为了简洁起见):

RewriteCond %{QUERY_STRING} set_cookie=1 [NC]
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}?skip=1 [QSA,NE,NC,L,CO=test_%{HTTP_HOST}:tmp:%{HTTP_HOST}:5:/]

这个设置名为test_ {host_name}的cookie。现在我想在下一个请求中读取该cookie值。我试过这个(以及一些变体),但这似乎不起作用。

RewriteCond %{QUERY_STRING} skip [NC]
RewriteCond %{HTTP_COOKIE} ^.*test_%{HTTP_HOST}=tmp.*$ [NC] 
RewriteRule ^(.*)$ - [L]

当我在谷歌上搜索时,我found an article声明了以下内容:

  

如果您想知道,"为什么不使用%{HTTP_HOST}代替corz.org,   创建通用代码?",据我所知,它无法测试   一个服务器变量与另一个服务器变量没有使用RewriteCond   Atomic Back References和一些严肃的POSIX 1003.2+ Jiggery-Pokery。

我想这是我的问题,但我对如何解决它感到有些茫然。非常感谢任何帮助。

此致 Joost的。

2 个答案:

答案 0 :(得分:1)

这方面有一个有用的技巧。它是简单的正则表达式,但是一种独特的mod_rewrite风格。

注意我对这里的匹配并不太在意,特别是在第一个条件下 - 这是在第二个条件下的说明:

RewriteEngine ON
RewriteCond %{HTTP_COOKIE} test_([^;]*)=tmp.*$
RewriteCond %1<>%{HTTP_HOST} ^(.+)<>\1
RewriteRule .* - [F]

新颖的部分(对于mod_rewrite)是你只能在第一个参数中使用变量/ backrefs,但你可以在第二个参数中使用backrefs(对于当前表达式,而不是前面的表达式)。

小&lt;&gt;只是不太可能作为分隔符出现的东西。

答案 1 :(得分:1)

我找到了解决方案。这部分是我原来的问题

RewriteCond %{QUERY_STRING} skip [NC]
RewriteCond %{HTTP_COOKIE} ^.*test_%{HTTP_HOST}=tmp.*$ [NC] 
RewriteRule ^(.*)$ - [L]

应替换为以下

RewriteCond %{QUERY_STRING} skip [NC]
RewriteCond %{HTTP_HOST}@@%{HTTP_COOKIE} ^([^@]*)@@.*test_\1=tmp.* [NC]
RewriteRule ^(.*)$ - [L]

只有第二个RewriteCond发生了变化。它的左侧(%{HTTP_HOST}@@%{HTTP_COOKIE})连接http主机和cookie值,使用@@作为粘合剂(@@没有真正意义上的东西,它不太可能在普通主机中使用或cookie字符串)。

右侧(^([^@]*)@@.*test_\1=tmp.*)将所有内容与第一个&#34; @&#34;,即主机名匹配,然后检查是否可以在cookie值的某处找到它,之前通过&#34; test _&#34;然后是&#34; = tmp&#34;。