Apache重写规则:如何检查Cookie中的主机名?

Apache重写规则:如何检查Cookie中的主机名?,apache,mod-rewrite,cookies,Apache,Mod Rewrite,Cookies,我正在使用重写规则设置cookie,这是可行的(为简洁起见简化): 这个设置了一个名为test{host\u name}的cookie。现在我想在下一个请求中读取cookie值。我尝试了这个(和一些变体),但似乎不起作用 RewriteCond %{QUERY_STRING} skip [NC] RewriteCond %{HTTP_COOKIE} ^.*test_%{HTTP_HOST}=tmp.*$ [NC] RewriteRule ^(.*)$ - [L] 当我在谷歌搜索时,我说了以下

我正在使用重写规则设置cookie,这是可行的(为简洁起见简化):

这个设置了一个名为test{host\u name}的cookie。现在我想在下一个请求中读取cookie值。我尝试了这个(和一些变体),但似乎不起作用

RewriteCond %{QUERY_STRING} skip [NC]
RewriteCond %{HTTP_COOKIE} ^.*test_%{HTTP_HOST}=tmp.*$ [NC] 
RewriteRule ^(.*)$ - [L]
当我在谷歌搜索时,我说了以下几点:

如果您想知道,“为什么不使用%{HTTP_HOST}而不是corz.org, “创建通用代码?”,据我所知,测试是不可能的 一个服务器变量与另一个服务器变量进行比较,并在不使用 原子回溯引用和一些严重的POSIX 1003.2+恶作剧

我想这是我的问题,但我有点不知所措,不知如何解决它。非常感谢您的帮助

问候,,
Joost.

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

注意,我对这里的匹配不太小心,特别是在第一种情况下——这是第二种情况下的图示:

RewriteEngine ON
RewriteCond %{HTTP_COOKIE} test_([^;]*)=tmp.*$
RewriteCond %1<>%{HTTP_HOST} ^(.+)<>\1
RewriteRule .* - [F]
重新编写引擎打开
RewriteCond%{HTTP_COOKIE}test\[^;]*]=tmp*$
重写条件%1%{HTTP_HOST}^(+)\1
重写规则。*-[F]
新颖的部分(对于mod_rewrite)是,您只能在第一个参数中使用变量/backrefs,但可以在第二个参数中使用backrefs(对于当前表达式,而不是前一个表达式)


这个小东西不太可能作为分隔符出现。

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

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]
只有第二次重写发生了更改。它的左侧(
%{HTTP\u HOST}@@@%{HTTP\u COOKIE}
)将HTTP主机和COOKIE值连接在一起,使用@作为粘合剂(@@实际上并不意味着什么,它只是不太可能在普通主机或COOKIE字符串中使用)


右侧(
^([^@]*)@.*test\1=tmp.
)将所有内容匹配到第一个“@”,即主机名,然后检查是否可以在cookie值中的某个位置找到它,前面是“test”?e、 g.subdomain.com和domain.com cookies都可以在subdomain.com上使用吗?那么,名为test_subdomain.domain.com和test_domain.com的cookies具有不同的值?我无法让它工作。我真的需要能够检查一个确切的cookiename,因为可能存在多个。我还需要能够检查饼干的缺失。。。
RewriteCond %{QUERY_STRING} skip [NC]
RewriteCond %{HTTP_HOST}@@%{HTTP_COOKIE} ^([^@]*)@@.*test_\1=tmp.* [NC]
RewriteRule ^(.*)$ - [L]