5

我的问题

我需要向 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/比较 )

我的问题

我无法完全弄清楚出了什么问题。根据Rubular,提供的正则表达式是正确的:

我在这里想念什么?

我将不胜感激有关解决此问题的任何建议!

4

1 回答 1

4

似乎正则表达式有点过于宽松 -.+需要稍微限制 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>
于 2014-08-01T08:26:10.193 回答