我正在内部计算机上设置Apache 2.4.6服务器以进行测试。 Apache服务器应该做的事情之一就是充当localhost上的另一个服务器的反向代理:3030。
localhost:3030上的服务器在其第一个路径级别上需要一个数据集名称中的一个(目前,该集合仅包含数据集experimental
,但稍后会添加更多数据集),因此我试图从请求的路径传递它。
在我的虚拟主机中,这有效:
<Location /experimental/>
ProxyPass http://localhost:3030/experimental/
ProxyPassReverse /
</Location>
对于其他数据集,我可以复制它并将experimental
替换为其他数据集名称。显然,这会导致大量的代码重复/冗余,这既是错误的根源,又是维护恐怖。
因此,我希望变得更灵活,并在一个这样的块中处理几个数据集。这应该可以使用LocationMatch
directive。
正如this comment和this 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 posting和ProxyPassMatch
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获取正则表达式。
但是,该文本并未提供有关如何合并LocationMatch
和ProxyPassMatch
的示例。 我做错了什么?
答案 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
在此示例中使用括号时,(?:
至关重要。