2014-09-25 81 views
6

我使用重写规则设置cookie,并在工作(简化简便起见):Apache重写规则:如何检查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, 创建通用的代码?” ,据我所知,无法使用 Atomic Back References和一些严重的POSIX 1003.2+ Jiggery-Pokery测试 一个服务器变量与另一个RewriteCond。

我想这是我的问题,但我对如何解决它有点不知所措。任何帮助是极大的赞赏。

Regards, Joost。

回答

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})使用@@作为粘连(@@并不真正意味着什么,它只是不太可能在普通主机或cookie字符串中使用)而连接http主机和cookie值。

右侧(^([^@]*)@@.*test_\1=tmp.*)将所有内容与主机名称中的第一个“@”匹配,然后检查它是否可以在cookie值的某处找到,其前面是“test_”,后面跟着“=” TMP”。

1

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

注意我不是太小心匹配这里特别是在第一个条件 - 这是为了说明在第二条件:

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

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

这个小小的<>就是不太可能出现的分隔符。

+0

为什么[F]而不是[L]? – jberculo 2014-10-02 09:21:45

+0

并不会因为部分具有相同名称的多个Cookie而中断吗?例如subdomain.domain.com和domain.com cookies都可以在subdomain.com上使用? 所以cookie用不同的值命名test_subdomain.domain.com和test_domain.com? – jberculo 2014-10-02 09:24:39

+0

我不明白它的工作。我真的需要能够检查一个确切的cookiename,因为可能存在多个。此外,我需要能够检查没有cookie ... – jberculo 2014-10-02 15:10:49