Apache 代理,ProxyPreserveHost On,继续循环

Apache 代理,ProxyPreserveHost On,继续循环

我有两个域名

域名 A : www.fakedomain.com ,这是客户端的域名,其原理是当 url 为http://www.fakedomain.com/blog

域名 B:www.mainblog.com,这是一个多站点 wordpress bloga.mainblog.com、blogb.mainblog.com 等

我试图将域 A 代理到域 B,但我想保留原始主机名(wordpress 需要),代理工作正常,但在 php $_SERVER['HTTP_HOST'] 中显示域 B(maindomain.com)而不是“fakedomain.com”,

我读到的解决方案是添加 ProxyPreserveHost On ,但在我添加它的瞬间,网站一直循环,直到 Google Chrome 崩溃,

我以为可能是由 Wordpress 引起的,所以我删除了所有文件,并且我只在 mainblog.com 中有一个 index.php,但仍然循环

<VirtualHost *:80>
    DocumentRoot "d:/www/wp-multisite"
    ServerName mainblog.com
    ServerAlias *.mainblog.com 
    ErrorLog  "logs/wpmultisite-error.log"
    CustomLog "logs/wpmultisite-access.log" common

</VirtualHost>

<VirtualHost *:80>
    ServerName www.fakedomain.com

    <IfModule mod_proxy.c>
        ProxyRequests Off
        ProxyPreserveHost   On
        ProxyPass         /     http://fake.mainblog.com/
        ProxyPassReverse  /     http://fake.mainblog.com/
    </IfModule>

    ErrorLog  "logs/fake-blog-error.log"
    CustomLog "logs/fake-blog-access.log" common
</VirtualHost>

答案1

Apache 还使用 Host 标头来识别要使用的 VirtualHost。通过告诉 mod_proxy 保留 Host 标头,apache 将始终使用第二个 VirtualHost 来处理请求。这就是您看到的循环。要解决这个问题,您需要确保不使用第二个 VirtualHost 来处理代理请求,尽管 Host 标头是 www.fakedomain.com。一种实现此目的的方法是在配置顶部添加一个 VirtualHost,如下所示:

<VirtualHost 127.0.0.1:80>
    DocumentRoot "d:/www/wp-multisite"
    ServerName www.fakedomain.com
    ServerAlias *.mainblog.com 
    ErrorLog  "logs/wpmultisite-error.log"
    CustomLog "logs/wpmultisite-access.log" common
</VirtualHost>

然后使用 hosts 文件确保 fake.mainblog.com 在该服务器上解析为 127.0.0.1。两者结合可确保 mod_proxy 使用 127.0.0.1 作为后端,同时保留主机头,而 127.0.0.1 与 Host: www.fakedomain.com 将导致上述 VirtualHost 用于处理 mod_proxy 的请求。

相关内容