我有两个域名
域名 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 的请求。