我正在内部机器上设置Apache 2.4.6服务器以进行测试.Apache服务器应该做的事情之一是作为localhost上的另一个服务器的反向代理:3030.
localhost:3030上的服务器在其第一个路径级别上需要一个数据集名称中的一个(目前,该集合仅包含数据集experimental
,但稍后将添加更多数据集),因此我试图将其传递给请求的路径.
在我的vhost中,这有效:
<Location /experimental/>
ProxyPass http://localhost:3030/experimental/
ProxyPassReverse /
</Location>
Run Code Online (Sandbox Code Playgroud)
对于其他数据集,我可以复制它并替换experimental
为其他数据集名称.显然,这会导致大量代码重复/冗余,这既是错误的根源,也是维护恐怖.
因此,我希望变得更灵活,并在一个这样的块中处理几个数据集.使用该LocationMatch
指令应该可以实现.
正如本评论和本页所示,我需要在块内使用时替换.从本质上讲,文档陈述相同:ProxyPass
ProxyPassMatch
LocationMatch
在LocationMatch部分中也会出现相同的情况,但是ProxyPass不会解释regexp,因此在这种情况下需要使用ProxyPassMatch.
该LocationMatch
文档解释:
从2.4.8开始,命名组和反向引用被捕获并写入环境,其对应的名称前缀为"MATCH_",大写.这允许从表达式和模块(如mod_rewrite)中引用URL元素.为了防止混淆,忽略编号(未命名)的反向引用.请改用命名组.
该信息仅在Apache 2.4.8中有效,这可能是以下原因导致我的2.4.6安装不起作用的原因:
<LocationMatch /(?<dataset>experimental)/>
ProxyPassMatch http://localhost:3030/%{env:MATCH_DATASET}/
ProxyPassReverse /
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)
另一方面,这个页面和那个帖子暗示数字组索引($1
)可以使用(因为帮助文本只有httpd 2.4.8有效,我怀疑/希望是数字参考在2.4.8之前工作(?)
无论如何,我试过这个:
<LocationMatch "/(experimental)/">
ProxyPassMatch http://localhost:3030/$1/
ProxyPassReverse /
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)
但根据日志,内部调用将调用http://localhost:3030/$1/
而不是http://localhost:3030/experimental/
在请求experimental
vhost URL上的路径时调用.
该ProxyPassMatch
文档只能说:
在LocationMatch部分中使用时,将省略第一个参数,并从LocationMatch获取正则表达式.
但是,该文本并没有提供如何组合LocationMatch …
如何使用LocationMatch
apache 匹配查询字符串?
<LocationMatch "/index.php\?a=b.*">
// ...
Run Code Online (Sandbox Code Playgroud)
......不幸的是不行.
我正在尝试使用它.htaccess
来更改RewriteBase
位置是本地服务器还是实时服务器.
Options +FollowSymlinks
RewriteEngine on
<LocationMatch "^/(bbtsrv02)/$">
#RewriteBase /beta/admin/
</LocationMatch>
RewriteCond %{REQUEST_URI} !index.php$
RewriteCond %{REQUEST_URI} !css/(.*)\.
RewriteCond %{REQUEST_URI} !img/(.*)\.
RewriteCond %{REQUEST_URI} !incs/(.*)\.
RewriteCond %{REQUEST_URI} !js/(.*)\.
RewriteCond %{REQUEST_URI} !upload/(.*)\.
RewriteCond %{REQUEST_URI} !widget/(.*)\.
RewriteRule ^(.*) index.php?_pd=$1 [NC,L]
Run Code Online (Sandbox Code Playgroud)
一旦我删除LocationMatch
整个事情再次开始工作.我只需要改变RewriteBase
实时测试.
我的问题
我需要有Apache HTTP Server (v2.4.10) 代理对Tomcat 的动态应用请求,这不仅与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>
Run Code Online (Sandbox Code Playgroud)
这使用以下示例路径传递 URL:(/products/aaa/bbb/ccc/ddd3456.html
这是正确的)
但是,当我还启用下面的正则表达式时:
<LocationMatch ^(?!.*\.html$)/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)((/?)|(./*))$>
ProxyPass balancer://mycluster/search/
ProxyPassReverse balancer://mycluster/search/
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)
尝试访问/products/aaa/bbb/ccc/
404 页面中的结果。在这里,我期待对“/products/aaa/bbb/ccc/”的任何不以 .html 结尾的请求传递给 /search/(包括要包含的任何后续路径信息:例如 .../search/相比 )
我的问题
我无法完全弄清楚出了什么问题。根据Rubular提供的正则表达式是正确的:
我在这里缺少什么?
我很感激任何关于解决这个问题的建议!