Apache LocationMatch Regex

时间:2014-07-31 07:02:45

标签: regex apache proxy mod-proxy locationmatch

我的问题

我需要向Tomcat提供针对动态应用程序的Apache HTTP Server(v2.4.10)代理请求,这些应用程序不仅与Tomcat中的路径不匹配,而且还具有相似的路径。例如:

/products/<category>/<sub-category>/<sub-sub-category>/<product-id>.html代理:http://mycluster/pf/<product-id>.html

......还有......

/products/<category>/<sub-category>/<sub-sub-category>/<anything-not-ending-in-html>代理:http://mycluster/search/<anything-not-ending-in-html>

我的尝试

我正在尝试使用LocationMatch正则表达式来处理这个问题,但我没有完全成功。以下LocationMatch正则表达式自行运行(将*.html请求代理到<tomcat>/pf/*.html):

<LocationMatch ^/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)/(?<partnum>.+).html>
ProxyPass balancer://mycluster/pf/%{env:MATCH_PARTNUM}.html
ProxyPassReverse balancer://mycluster/pf/%{env:MATCH_PARTNUM}.html
</LocationMatch>

使用以下示例路径传递URL:/products/aaa/bbb/ccc/ddd3456.html(这是正确的)

但是,当我也启用下面的正则表达式时:

<LocationMatch ^(?!.*\.html$)/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)((/?)|(./*))$>
ProxyPass balancer://mycluster/search/
ProxyPassReverse balancer://mycluster/search/
</LocationMatch>

尝试访问/products/aaa/bbb/ccc/会导致404页面。 在这里,我期待任何不以.html结尾的“/ products / aaa / bbb / ccc /”请求传递给/ search /(包括要包含的任何后续路径信息:例如... / search /比较)

我的问题

我无法弄清楚出了什么问题。根据{{​​3}}提供的正则表达式是正确的:

我在这里缺少什么?

我很感激任何有关解决这个问题的建议!

1 个答案:

答案 0 :(得分:3)

似乎正则表达式有点过于宽松 - cat / subcat / subsubcat中.+的范围需要稍微约束。最终表达式("./*")也有轻微错误,这应该是("/.*")

工作位置匹配:

<LocationMatch ^(?!.*\.html$)/products/(?<cat>([A-Za-z0-9\-\_])+)/(?<subcat>([A-Za-z0-9\-\_])+)/(?<subsubcat>([A-Za-z0-9\-\_])+)((/?)|(/.*))$>
ProxyPass balancer://mycluster/search/
ProxyPassReverse balancer://mycluster/search/
</LocationMatch>