ProxyPassMatch中无法识别LocationMatch中的命名组反向引用

问题描述

我的英语很差,这是我的第一个问题,所以希望我做得对;-)

我使用Apache HTTPD 2.4.41(Win64),并且想使用以下LocationMatch-Rule:

<LocationMatch "^/es/(?<ind>.*)/_search$">
    AllowMethods GET POST       
    
    ProxyPassMatch http://localhost:9200/%{MATCH_IND}/_search
    ProxyPassReverse http://localhost:9200
</LocationMatch>

该规则似乎匹配,因为我收到了来自后端服务器(ElasticSearch)的响应。响应正文显示,命名的组反向引用无法正常工作:

GET /es/archives/_search
{
    "error": "no handler found for uri [/%25%7BMATCH_IND%7D/_search/es/archives/_search] and method [POST]"
}

似乎命名的组反向引用未被识别,并且已经被直接传递给后端服务器而没有被解释。

至少已附加原始URL(如the doc中所述)。作为一种解决方法,我什至可以这样保留,但我认为这不是实现此目的的正确方法

任何关于Apache为何无法识别命名组反向引用和变量的原因的想法吗?我的Apache版本(2.4.41)也应该很好,因为2.4.8版中已引入命名组反向引用。

我实际上在Stack Overflow和Google上花费了数小时,以寻找类似的情况,但到目前为止没有任何帮助。

希望,有人可以帮忙!

解决方法

似乎 <LocationMatch> 文档在使用带有 ProxyPassProxyPassMatch 的匹配表达式时非常模糊。 %{MATCH_*} 表达式似乎不适用于它们。然而,似乎反向引用(即$1)确实有效。所以你可能想要这样的东西:

<LocationMatch "^/es/(?<ind>.*)/_search$">
    AllowMethods GET POST       
    
    ProxyPassMatch http://localhost:9200/$1/_search
    ProxyPassReverse http://localhost:9200
</LocationMatch>

注意,需要在正则表达式中使用命名组,否则不会填充反向引用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...