ProxyPass for特定的虚拟主机与mod_rewrite

我有一个Web服务器,它设置为不同的域dynamic服务不同的文档根

<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/的文档根目录:/ 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在位置中定义时不能有path。

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

只要将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 

使用新的VirtualHost

如果您在当前版本之上添加新的VirtualHost并在ServerName指定域,则可以代理该特定域。

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

 <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> 

我build议在服务器级别设置ProxyRequests Off

当Apache尝试匹配域名时,它首先匹配。 configuration文件中的第一个匹配项(VirtualHost,ServerName或ServerAlias)将用于路由stream量。 对于通配符没有特别的处理,所以任何特定的服务器名称声明都需要出现在通配符虚拟主机之前。

ProxyPreserveHost只能在Server和VirtualHost上下文中使用。 所以如果你必须使用这个指令,你需要把它放在一个新的VirtualHost中。