如何组合LocationMatch和ProxyPassMatch?

O. *_*per 12 apache proxypass locationmatch

我正在内部机器上设置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 ProxyPassMatchLocationMatch

在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/在请求experimentalvhost URL上的路径时调用.

ProxyPassMatch文档只能说:

在LocationMatch部分中使用时,将省略第一个参数,并从LocationMatch获取正则表达式.

但是,该文本并没有提供如何组合LocationMatch和的示例ProxyPassMatch.我究竟做错了什么?

Jer*_*ost 2

在 Apache 2.4.29 上可以正常工作:

<LocationMatch "/fruit/(?:apple|banana|pear)">
    ProxyPass        http://localhost:8080
    ProxyPassReverse http://localhost:8080
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

Apache调用的URL例如

http://localhost:8080/fruit/apple
Run Code Online (Sandbox Code Playgroud)

(?:当您在此示例中使用括号时,这一点至关重要。