我之前问过同样的问题,但我想我没有正确提出问题。我试图将整个虚拟主机域反向代理到另一个虚拟主机的子目录,如下所示http://host2.com->http://host1.com/host2。
Apache 的默认站点文件是这个
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName "host1.com"
<Directory /srv/www/host1>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order deny,allow
Allow from all
</Directory>
DocumentRoot /srv/www/host1
WSGIScriptAlias / /srv/www/host1/apache/django.wsgi
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName "host2.com"
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://host1.com/host2
ProxyPassReverse / http://host1.com/host2
</VirtualHost>
现在的问题是,每当我去http://host2.com它告诉我http://host1.com代替http://host1.com/host2。我遗漏了什么?我不确定这是否重要,但 host1 是使用带有 wsgi 的 Django 托管的。
答案1
ProxyPass
对于斜杠非常挑剔;因为您要代理尾部斜杠(仅根/
),所以您需要代理 TO 尾部斜杠。
因此,在目标中添加一些尾随斜杠(如下所示)应该会有所帮助。
此外,由于您代理的设备也是本地系统,因此您可能希望使用 127.0.0.1 来避免潜在的名称解析/NAT 混淆。您在此处放置的内容与服务器收到的主机标头无关,只要您设置了以下内容,客户端标头就会传递ProxyPreserveHost On
:
ProxyPreserveHost On
ProxyPass / http://127.0.0.1/host2/
ProxyPassReverse / http://127.0.0.1/host2/
如果这不起作用,也许可以让 host2 提供一些临时内容页面来验证您是否访问了正确的 vhost。
附注:您不需要该<Proxy *>
块。它是为您在模式下运行时构建的ProxyRequests on
,并且无法按预期用于反向代理(<Location>
而是用于访问控制)