apache - 在 RewriteCond 条件模式中使用变量

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

一旦应用程序 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/

相关文章:

mysql - RewriteMap MapType dbd 的问题

python - 如何在 apache 上配置 django 并在 apache 中创建 https 以便 django url 应使用 https ://<ip>:80 port 打开

php - Apache 重写到 Nginx 重写

javascript - htaccess rewriteRule,CSS 和 JS 文件调用整个网页的 html 标记

regex - htaccess 删除?从 url 和重定向

Apache RewriteRule 与 RewriteMap

apache - 在 htaccess 文件中使用 RewriteMap

apache - 如何给apache tomcat服务器增加空间

apache - 将 .htaccess 导入 IIS URL 重写 Web.Config 时出现问题

java - 使用 AJP 连接器和 mod_proxy 在 Tomcat 前面的 Apache 出错