我想将用户 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 与我的 map 匹配,有什么想法可以阻止循环吗?
最佳答案
/3/615/index.html 正确重定向到/1/615/index.html
问题是您也将/1/615/index.html 重定向到/1/615/index.html - 您想要检测 map 转换是空操作的情况,在那种情况下根本不重定向。
如果您不关心面向用户的 URL,只需将 [R,L] 更改为 [L](删除 R),您应该没问题,因为它不会触发来自客户。
$2 反向引用在 RewriteCond 表达式中不起作用是对的;这是因为尚未评估 RewriteRule。您可能能够使用 %n - 对先前 RewriteCond 中的正则表达式的样式反向引用...
RewriteCond {%REQUEST_URI} ^/([0-9]+)/
RewriteCond {%REQUEST_URI} !^/${map:%1}
但是我没有测试过这个,所以YMMV。
关于apache - 在 RewriteCond 条件模式中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24327143/