如何组合LocationMatch和ProxyPassMatch?

时间:2014-02-04 09:35:25

标签: apache proxypass locationmatch

我正在内部计算机上设置Apache 2.4.6服务器以进行测试。 Apache服务器应该做的事情之一就是充当localhost上的另一个服务器的反向代理:3030。

localhost:3030上的服务器在其第一个路径级别上需要一个数据集名称中的一个(目前,该集合仅包含数据集experimental,但稍后会添加更多数据集),因此我试图从请求的路径传递它。

在我的虚拟主机中,这有效:

<Location /experimental/>
    ProxyPass http://localhost:3030/experimental/
    ProxyPassReverse /
</Location>

对于其他数据集,我可以复制它并将experimental替换为其他数据集名称。显然,这会导致大量的代码重复/冗余,这既是错误的根源,又是维护恐怖。

因此,我希望变得更灵活,并在一个这样的块中处理几个数据集。这应该可以使用LocationMatch directive

正如this commentthis page所示,我需要在LocationMatch块内使用ProxyPass替换ProxyPassMatch docs。基本上,LocationMatch docs状态相同:

  

同样会在LocationMatch部分内发生,但是ProxyPass不会解释regexp,所以在这种情况下需要使用ProxyPassMatch。

this page解释:

  

从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>

另一方面,that postingProxyPassMatch docs意味着可以使用数字组索引($1)(因为帮助文本仅在httpd 2.4.8中有效,我的怀疑 / 希望是数字参考在2.4.8之前工作的(?)

无论如何,我试过这个:

<LocationMatch "/(experimental)/">
    ProxyPassMatch http://localhost:3030/$1/
    ProxyPassReverse /
</LocationMatch>

但是根据日志,当在vhost URL上请求http://localhost:3030/$1/路径时,内部调用会调用http://localhost:3030/experimental/而不是experimental

{{3}}只说:

  

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

但是,该文本并未提供有关如何合并LocationMatchProxyPassMatch的示例。 我做错了什么?

2 个答案:

答案 0 :(得分:2)

该文档还指出"commandPalette": [ { "command": "extension.helloWorld", "when": "resourceLangId == php", // && fileExtension == .php4 } ] ,这似乎是您的情况。 此外,您在When the URL parameter doesn't use any backreferences into the regular expression, the original URL will be appended to the URL parameter.指令中缺少主机。

这应该可以正常工作:

ProxyPassReverse

答案 1 :(得分:-1)

使用Apache 2.4.29:

<LocationMatch "/fruit/(?:apple|banana|pear)">
    ProxyPass        http://localhost:8080
    ProxyPassReverse http://localhost:8080
</LocationMatch>

Apache调用的URL例如是

http://localhost:8080/fruit/apple

在此示例中使用括号时,(?:至关重要。