Apache:反向代理整个域

Neo*_*Neo 5 domain proxy reverse-proxy virtualhost apache-2.2

不久前我问了同样的问题,但我想我没有把我的问题说对。我正在尝试将整个虚拟主机域反向代理到另一个虚拟主机的子目录,例如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>
Run Code Online (Sandbox Code Playgroud)

此时,问题是每当我去http://host2.com 时,它都会显示http://host1.com而不是http://host1.com/host2。我错过了什么?我不确定这是否重要,但是 host1 是使用带有 wsgi 的 Django 托管的。

Sha*_*den 6

ProxyPass对斜线非常挑剔;由于您代理的是尾随斜杠(只是根,/),因此您需要代理尾斜杠。

因此,为您的目标添加一些尾部斜杠,如下所示,应该会有所帮助。

此外,由于您代理的设备也是本地系统,您可能希望通过使用 127.0.0.1 来避免潜在的名称解析/NAT 混淆。您在此处放置的内容与服务器接收到的主机标头无关,并且只要您已ProxyPreserveHost On设置,客户端标头就会通过:

ProxyPreserveHost On
ProxyPass / http://127.0.0.1/host2/
ProxyPassReverse / http://127.0.0.1/host2/
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,则可能让 host2 提供一些临时内容页面以验证您是否访问了正确的虚拟主机。

旁注,你不想要那个<Proxy *>块。它是为在ProxyRequests on模式下运行而构建的,对于反向代理无法按预期工作(<Location>而是用于访问控制)