我的问题
我需要向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}}提供的正则表达式是正确的:
我在这里缺少什么?
我很感激任何有关解决这个问题的建议!
答案 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>