我在 Apache 2.4.6 上有以下最小测试用例:
<VirtualHost *:80>
# Match all paths excluding /proxy
<LocationMatch ^/prefix/((?!proxy/).*)$>
ProxyPassMatch http://127.0.0.1:8082/$1
</LocationMatch>
# Match /proxy specifically
<Location /prefix/proxy/>
ProxyPass "http://127.0.0.1:8082/proxy/"
</Location>
</VirtualHost>
(这里的两个位置做同样的事情,但是当然在生产机器上的配置会有所不同。)
尝试使用此配置运行 Apache 时,失败并出现以下错误:
AH00526: Syntax error on line 7 of /etc/httpd/conf.d/broken.conf:
ProxyPass/<Proxy> and ProxyPassMatch/<ProxyMatch> can't be used altogether
with the same worker name (http://127.0.0.1:8082/$1)
我无法弄清楚错误消息的含义(它甚至不是正确的英语!)以及如何解决它。据我所见,ProxyPass 工作器名称不同 - 它们一定是不同的,因为 URL 是互斥的!
Google 只返回了 3 条错误信息,其中两条指向 Apache 源代码。如果我删除第 3 行和第 7 行中的任意一条指令,配置就可以正常工作。
答案1
您定义代理传递指令的方式使得这些奇怪的问题成为可能。
主要错误是您两次使用相同的匹配路径定义相同的目标,一次使用正则表达式,另一次则不使用。
你又犯了错误。不要混淆 ProxyPass 和 Location。这是将一个可以采用 uri-path 的指令与另一个引用 uri-path 但工作方式不同的指令混合在一起,即虚拟主机中的 ProxyPass 第一个参数是 uri-path,而 Location 也引用 uri-path,但其优先级不同(具有大多数全局路径的 Location 应该首先定义,但 proxypass 的工作方式相反),那么为什么要混合它们?除非你想让它难以阅读,否则你不应该这样做。
因此,简而言之,您的修复方法是按照正确的顺序或优先级使用 ProxyPass,这样阅读和配置起来会更简单,并且可以准确地完成您想要的操作:
<VirtualHost *:80>
ProxyPass /prefix/proxy/ http://127.0.0.1:8082/proxy/
ProxyPass /prefix/ http://127.0.0.1:8082/
</VirtualHost>
注意:如果您需要将特定指令(如 auth 或诸如此类)应用于其中一个 uri,那么您可以单独使用 Location。