3

我想将用户 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} 在条件模式中没有被替换,而是“按原样”检查。然后条件总是为真,我仍然得到我的无限循环。

一旦应用程序 id 与我的地图匹配,有什么想法可以阻止循环吗?

4

1 回答 1

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。

于 2014-10-15T22:00:19.730 回答