使用 mod_rewrite 为特定 vhost 提供 ProxyPass

使用 mod_rewrite 为特定 vhost 提供 ProxyPass

我有一个 Web 服务器,它被设置为动态地为不同的域提供不同的文档根目录

<VirtualHost *:80>
    <IfModule mod_rewrite.c>
        # Stage sites :: www.[document root].server.company.com => /home/www/[document root]
        RewriteCond   %{HTTP_HOST}          ^www\.[^.]+\.server\.company\.com$
        RewriteRule   ^(.+)                 %{HTTP_HOST}$1          [C]
        RewriteRule   ^www\.([^.]+)\.server\.company\.com(.*) /home/www/$1/$2  [L]
    </IfModule>
</VirtualHost>

这使得它将www.foo.server.company.com服务于文档根目录server.company.com:/home/www/foo/

对于其中一个网站,我需要添加ProxyPass,但我只希望它应用于该网站。我尝试了类似

<VirtualHost *:80>
    <Directory /home/www/foo>
        UseCanonicalName Off
        ProxyPreserveHost On
        ProxyRequests Off
        ProxyPass /services http://www-test.foo.com/services
        ProxyPassReverse /services http://www-test.foo.com/services
    </Directory>
</VirtualHost>

但后来我得到了这些错误

此处不允许使用 ProxyPreserveHost

ProxyPass|ProxyPassMatch 在某个位置定义时不能有路径。

如何设置ProxyPass单个虚拟主机?

答案1

只需将其ProxyPass移出<Directory>块 - 如果它在该上下文中,则预计它会适用于该精确的上下文(而不是/services您希望它申请的上下文)。

实际上,看起来你根本没有用该块做任何事情,是吗?

<VirtualHost *:80>
    UseCanonicalName Off
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass /services http://www-test.foo.com/services
    ProxyPassReverse /services http://www-test.foo.com/services
    # and if you do need to serve from /home/www/foo...
    DocumentRoot /home/www/foo
    <Directory /home/www/foo>
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

编辑:错过了它实际上不是虚拟主机 - 你的例子只是虚拟主机块中的一个目录,这让我认为它们是分开的。

在这种情况下...

ProxyPreserveHost On
# If it's not already:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.foo
RewriteRule ^/services(.*) http://www-test.foo.com/services$1 [P,L]
ProxyPassReverse /services http://www-test.foo.com/services

答案2

使用新的虚拟主机

如果您VirtualHost在当前域上方添加一个新域并在其中指定域ServerName,那么您可以代理该特定域。

NameVirtualHost如果您使用的是 Apache 2.3.11 之前的版本,则可能需要添加。

<VirtualHost *:80>
        ServerName www.targetdomain.com
        ProxyPreserveHost On
        ProxyPass /services http://www-test.foo.com/services
        ProxyPassReverse /services http://www-test.foo.com/services

    <IfModule mod_rewrite.c>
        # Stage sites :: www.[document root].server.company.com => /home/www/[document root]
        RewriteCond   %{HTTP_HOST}          ^www\.[^.]+\.server\.company\.com$
        RewriteRule   ^(.+)                 %{HTTP_HOST}$1          [C]
        RewriteRule   ^www\.([^.]+)\.server\.company\.com(.*) /home/www/$1/$2  [L]
    </IfModule>
</VirtualHost>

我建议ProxyRequests Off在服务器级别进行设置。

当 Apache 尝试匹配域名时,它会根据第一次匹配进行匹配。配置文件中的第一个匹配项(VirtualHost、ServerName 或 ServerAlias)将用于路由流量。对于通配符没有特殊处理,因此任何特定的服务器名称声明都需要出现在通配符虚拟主机之前。

ProxyPreserveHost仅在 Server 和 VirtualHost 上下文中允许。因此,如果您必须使用该指令,则需要将其放置在新的 VirtualHost 中。

相关内容