我正在使用重写规则设置一个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的。
答案 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;。