我想配置 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”。