jbe*_*ulo 6 apache cookies mod-rewrite
我正在使用重写规则设置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:/]
Run Code Online (Sandbox Code Playgroud)
这个设置名为test_ {host_name}的cookie.现在我想在下一个请求中读取该cookie值.我试过这个(以及一些变体),但这似乎不起作用.
RewriteCond %{QUERY_STRING} skip [NC]
RewriteCond %{HTTP_COOKIE} ^.*test_%{HTTP_HOST}=tmp.*$ [NC]
RewriteRule ^(.*)$ - [L]
Run Code Online (Sandbox Code Playgroud)
当我在Google上搜索时,我发现了一篇文章说明了以下内容:
如果您想知道"为什么不使用%{HTTP_HOST}而不是corz.org,创建通用代码?",据我所知,不能使用RewriteCond测试一个服务器变量而不使用Atomic Back References和一些严肃的POSIX 1003.2+ Jiggery-Pokery.
我想这是我的问题,但我对如何解决它感到有些茫然.任何帮助是极大的赞赏.
问候,Joost.
我找到了解决办法。这部分在我原来的问题中
RewriteCond %{QUERY_STRING} skip [NC]
RewriteCond %{HTTP_COOKIE} ^.*test_%{HTTP_HOST}=tmp.*$ [NC]
RewriteRule ^(.*)$ - [L]
Run Code Online (Sandbox Code Playgroud)
应替换为以下内容
RewriteCond %{QUERY_STRING} skip [NC]
RewriteCond %{HTTP_HOST}@@%{HTTP_COOKIE} ^([^@]*)@@.*test_\1=tmp.* [NC]
RewriteRule ^(.*)$ - [L]
Run Code Online (Sandbox Code Playgroud)
只有第二个 RewriteCond 发生了变化。它的左侧 ( %{HTTP_HOST}@@%{HTTP_COOKIE}) 使用 @@ 作为粘合剂连接 http 主机和 cookie 值(@@ 并不真正意味着什么,它只是不太可能在普通主机或 cookie 字符串中使用)。
右侧 ( ^([^@]*)@@.*test_\1=tmp.*) 将所有内容与第一个“@”(主机名)相匹配,然后检查是否可以在 cookie 值中的某个位置找到它,前面是“test_”,后面是“=tmp”。