如何将上下文代理到 apache 中的不同后端上下文

如何将上下文代理到 apache 中的不同后端上下文

我想配置 apache,以便http://my-domain.com/myapp在后端服务器上提供在 CherryPy 中运行的 Python webapp。

以下是虚拟主机中的内容:

    RewriteRule ^/myapp/?(.*) http://backend-server:8000/$1 [P]
    ProxyPassReverse /myapp/ http://backend-server:8000/

当我跟踪请求/响应时,我看到:

GET /myapp HTTP/1.1
Host: my-domain.com

进而:

HTTP/1.1 303 See Other
Date: Thu, 15 Sep 2011 21:46:35 GMT
Server: CherryPy/3.1.2
Content-Type: text/html;charset=utf-8
Location: http://my-domain.com/somwhere-else/

如您所见,CherryPy Web 应用程序发送 303 重定向到 /somewhere-else/

为什么 Apache ProxyPassReverse 不将位置转换为http://my-domain.com/myapp/somewhere-else

答案1

您的源位置是/myapp,而您的ProxyPassReverse/myapp/;代理位置的上下文不匹配,因此ProxyPassReverse不适用。

为什么要使用 mod_rewrite 代理?这应该可以达到同样的效果,而且不会出现尾部斜杠一致性问题:

ProxyPass /myapp http://backend-server:8000
ProxyPassReverse /myapp http://backend-server:8000

答案2

我遇到了同样的问题并按如下方式修复它:

由于某种原因,两个上下文路径必须相同,因此我将应用程序上下文路径修改为相等(请注意 passResever 上的额外“/”)

    ProxyPass               /jira           http://192.168.1.30:8080/jira
    ProxyPassReverse        /jira/          http://192.168.1.30:8080/jira

答案3

问题在于后端应用程序返回一个带有公共名称“my-domain.com”的 Location 标头,因此 ProxyPassReverse 无法识别它。后端服务器不应该知道公共名称(前端名称),它应该只知道名称“backend-server”。

相关内容