Apache 反向代理到与 http 相同的上下文中的 websocket

Apache 反向代理到与 http 相同的上下文中的 websocket

我有一个 Apache/2.4.6 安装,用作某些应用程序的反向代理。现在我必须配置另一个。HTTP 代理运行良好,但在网页的某些部分,客户端会尝试启动 websocket 连接。

问题是 URL 被部分共享:

HTTP 请求:http://domain/context/[whatever]

WS 请求:ws://domain/context/specific-text?param1&param2

无法使用If(检查协议),因为 ProxyPass 无法进入<If>

尝试的设置:

<Location /context/specific-text>
    ProxyPass ws://internal.domain/context/specific-text

<Location /context/>
    ProxyPass http://internal.domain/context/

但它不起作用,猜测是因为(不存在的)尾随斜杠。

更多数据:

  • 套接字抱怨不喜欢“200”代码,Apache 没有返回 ws 连接,但在某种程度上,正在进行代理。
  • 尝试过有或没有<Location>
  • 想过重写specific-textspecific-text/但我不喜欢操纵我无法管理的东西。该应用程序是付费产品,不能问它是否会造成任何损害。好吧,我可以,但我不会期待任何答案。

答案1

对我有用的是这个 ProxyPass 配置片段:

ProxyPass        /specific wss://0.0.0.0:4000/specific
ProxyPassReverse /specific wss://0.0.0.0:4000/specific

ProxyPass        / https://0.0.0.0:4000/
ProxyPassReverse / https://0.0.0.0:4000/

文档说

订购 ProxyPass 指令

按照配置的顺序检查已配置的 ProxyPass 和 ProxyPassMatch 规则。第一个匹配的规则获胜。

相关内容