如何使用.htaccess在多个RewriteCond中获取返回引用变量

时间:2012-06-11 12:04:24

标签: .htaccess mod-rewrite

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

有问题的规则是第二个,请注意后面引用%1

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

这是我期待发生的事情。给定URL

http://example.com/abc/home

第一条规则应将abc存储在%1中 我想要一个名为route_controller_abc的cookie的第二个规则,如果找到的话 然后第三条规则将重新加入

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

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

任何想法?

1 个答案:

答案 0 :(得分:2)

原因是字符串替换仅发生在cond的第一个参数而不是其rexexp上。您必须使用\1

来进行模拟regexp中的参数的操作

您还可以在规则regexp中选择目录,因为执行顺序是规则regexp,cond1,cond2,...规则替换。例如。 ^(*.?)/.*$的{​​{1}}会将abc/home设置为$1,将$ 0设置为abc。因此我会尝试类似的事情:

abc/home

请注意,控制器现在位于%2中,因为%1用于绑定cond regexp中的目录。

希望这有助于并回答你的直接问题.Hovever,我会因使用未经验证的cookie进行重定向而有点抽搐。如果我这样做,我会收紧参数RewriteCond $1:%{HTTP_COOKIE} ^(.*?):.*\broute_controller_\1=([^;]+) [NC] RewriteRule ^(*.?)/.*$ http://example2.com/%2/_/$0 [L] 的验证或将其移到一个小的PHP重定向器脚本并在那里进行验证: - )