在RewriteCond条件模式中使用变量

时间:2014-06-20 12:20:21

标签: apache mod-rewrite rewritemap

我想将用户ID与特定的应用程序ID相关联,如:

<user_id> <app_id>  
615 1
616 7
617 3
618 3    

我的URI看起来像:

/<app_id>/<user_id>/...

现在,我希望能够在不影响用户书签的情况下轻松更改应用程序。在我的例子中,我想要两个

/1/615/index.html or /3/615/index.html

将作为

/1/615/index.html

使用以下规则,我得到无限循环:

RewriteMap map dbm:user-application.map
RewriteRule ^/([0-9]+)/([0-9]+)/(.*)$ /${map:$2}/$2/$3 [R,L]              
...
#other proxy code to forward request to applications

据我所知,在重定向之后,Apache将始终执行相同的规则。 然后我尝试添加重写条件来阻止循环,比如

RewriteMap map dbm:user-application.map
RewriteCond %{REQUEST_URI} !^/${map:$2}
RewriteRule ^/([0-9]+)/([0-9]+)/(.*)$ /${map:$2}/$2/$3 [R,L]              

如果我正确读取了我的重写日志,我可以看到变量!^ / $ {map:$ 2}在条件模式中没有被替换,但是检查了#34;因为它&#34;。然后条件总是正确的,我仍然得到无限循环。

一旦应用程序ID与我的地图匹配,任何想法都会阻止循环吗?

1 个答案:

答案 0 :(得分:1)

/3/615/index.html正确重定向到/1/615/index.html

问题是您正在将/1/615/index.html重定向到/1/615/index.html - 您想要检测地图转换是无操作和的情况在这种情况下根本不会重定向。

如果您不关心面向用户的URL,只需将[R,L]更改为[L](删除R),您应该没问题,因为它不会触发新的往返客户。

你是对的,$ 2反向引用在RewriteCond表达式中不起作用;这是因为尚未评估RewriteRule。您可以在之前的RewriteCond中使用%n样式的反向引用到正则表达式...

RewriteCond {%REQUEST_URI} ^/([0-9]+)/
RewriteCond {%REQUEST_URI} !^/${map:%1}

但我没有测试过这个,所以YMMV。