我有一个 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 中。