ProxyPass para vhost específico com mod_rewrite

1

Eu tenho um servidor da Web configurado para dinamizar diferentes raízes de documentos para diferentes domínios

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

Isso faz com que www.foo.server.company.com veicule a raiz do documento de server.company.com:/home/www/foo/

Para um desses sites, preciso adicionar um ProxyPass , mas só quero que ele seja aplicado a esse site. Eu tentei algo como

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

Mas então eu recebo esses erros

ProxyPreserveHost not allowed here

ProxyPass|ProxyPassMatch can not have a path when defined in a location.

Como posso configurar um ProxyPass para um único host virtual?

    
por Steve Robbins 07.11.2013 / 04:52

2 respostas

2

Apenas mova ProxyPass do bloco <Directory> - se estiver nesse contexto, espera-se que seja aplicado ao contexto exato (em vez do /services para o qual você deseja se inscrever).

Na verdade, você não está fazendo nada com esse bloco, parece?

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

edit: Senti falta de que não sejam realmente hosts virtuais - seu exemplo onde é apenas um diretório em um bloco de host virtual me fez pensar que eles eram separados.

Nesse caso ...

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
    
por 07.11.2013 / 05:13
1

Use um novo VirtualHost

Se você adicionar um novo VirtualHost acima do seu atual e especificar o domínio em ServerName , poderá proxy desse domínio específico.

Você pode precisar adicionar um NameVirtualHost se você estiver no Apache antes da versão 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>

Recomendo definir ProxyRequests Off no nível do servidor.

Quando o Apache tenta combinar nomes de domínio, ele faz isso em uma base de primeira correspondência. A primeira correspondência (VirtualHost, ServerName ou ServerAlias) no arquivo de configuração será a usada para rotear o tráfego. Não há tratamento especial para curingas, portanto, quaisquer declarações de nome de servidor específicas precisam aparecer antes do seu host virtual curinga.

ProxyPreserveHost é permitido apenas no contexto do servidor e do VirtualHost. Portanto, se você precisar usar essa diretiva, precisará colocá-la em um novo VirtualHost.

    
por 07.11.2013 / 15:09