1

这些重写规则似乎不起作用。这是不可能的还是我错过了什么

有问题的规则是第二个,注意反向引用 %1

RewriteCond %{REQUEST_URI} ^/([a-zA-Z\.]+)/.*$ [NC]
RewriteCond %{HTTP_COOKIE} route_controller_%1=([^;]+) [NC]
RewriteRule ^(.*)$ http://example2.com/%1/_/$1 [L]

这就是我期望发生的事情。给定网址

http://example.com/abc/home

第一条规则应该将 abc 存储在 %1 我想要一个名为 route_controller_abc 的 cookie 的第二条规则,如果找到那么第三条规则将重写为

http://example2.com/thevalueofthecookie/_/home

但是 seconf 规则似乎没有使用 %1 反向引用。

有任何想法吗?

4

1 回答 1

2

这样做的原因是字符串替换只发生在 cond 的第一个参数中,而不发生在它的 rexexp 上。您必须使用\1等来模拟正则表达式中的参数。

您也可以在规则正则表达式中选择目录,因为执行顺序是规则正则表达式、cond1、cond2、...规则替换。例如。^(*.?)/.*$forabc/home将设置$1abc$0 为abc/home. 因此我会尝试类似的东西:

RewriteCond $1:%{HTTP_COOKIE} ^(.*?):.*\broute_controller_\1=([^;]+) [NC]
RewriteRule ^(*.?)/.*$        http://example2.com/%2/_/$0            [L]

请注意,控制器现在位于 %2 中,因为 %1 用于在 cond 正则表达式中绑定目录。

希望这有助于并回答您的直接问题。但是,使用这样的未经验证的 cookie 进行重定向,我会有点紧张。如果我这样做,我会加强对参数的验证,([^;]+)或者将其移至一个小的 PHP 重定向器脚本并在那里进行验证:-)

于 2012-06-11T13:42:52.207 回答