Apache Rewrite ou Proxy para o servidor interno

3

Primeiro, esta é a minha primeira vez no apache, então, por favor, perdoe meu principinismo:)

Minha configuração básica é assim: mysub.domain.com é enviada para meu IP estático por meio de uma entrada CNAME no gerenciador de DNS do godaddy. Ele atinge meu servidor Ubuntu 10 LTS executando o Apache2.

Eu tenho uma entrada de host virtual que direciona essa solicitação para a pasta /var/www/mysub adequada. Eu não tenho nenhum conteúdo, mas adicionei uma linha à página "It Works", para saber se cheguei lá com sucesso. Eu também tenho um Mac Mini rodando um servidor wiki na mesma rede local que o servidor Ubuntu.

Gostaria que mysub.domain.com acessasse meu servidor Mini em vez da pasta /var/www/mysub .

Depois de muita leitura neste site e em outros, eu consegui fazer isso ... mais ou menos.

Eu tenho o seguinte no meu /var/www/mysub/.htacess , que encontrei em outra pergunta do SF (esqueci de copiar o link).

RewriteEngine on
RewriteCond %{HTTP_HOST} ^mysub.domain.com/*
RewriteRule .* http://192.168.x.x/ [P,L]

Isso funciona de modo que redireciona mysub.domain.com para a página inicial do Mini. Mas, é claro, todos os links subsequentes também clicam na página Mini. Eu acho que entendo porque está fazendo (qualquer coisa que comece com mysub.domain.com é direcionada para o que é essencialmente a primeira página do servidor wiki, e como os links subseqüentes no servidor wiki também incluem mysub.domain.com , ele sempre termina no mesmo lugar)

Eu só não sei o que fazer diferente. Para ser perfeitamente honesto, eu não entendo a sintaxe dessas linhas de reescrita.

Eu vi inúmeros exemplos de entradas de configuração e tentei algumas delas, mas sem realmente entender a sintaxe, é meio que fotografar no escuro.

Este foi um post útil e depois de ler esta pergunta, tentei adicionar isso ao meu arquivo /apache2/httpd.conf

<Location />
   ProxyPass http://192.168.x.x
   ProxyPassReverse http://192.168.x.x
</Location>

Sem sorte.

Claramente, tenho algum aprendizado para fazer, mas parece-me que o que eu quero fazer é, provavelmente, bastante simples. O que estou perdendo?

EDITAR POR COMENTÁRIOS

Meu arquivo /etc/apache2/httpd.conf

ServerName localhost

<VirtualHost *:80>
   ServerName domain.com
   ServerAlias www.domain.com
   DocumentRoot /var/www/domain
</VirtualHost>

<VirtualHost *:80>
   ServerName mysub.domain.com
   DocumentRoot /var/www/mysub
   <Location />
      ProxyPass http://192.168.x.x/
      ProxyPassReverse http://192.168.x.x/
   </Location>
</VirtualHost>

... e meu arquivo sites-available/mysub ...

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName mysub.domain.com
        DocumentRoot /var/www/mysub

        #ProxyRequests Off
        <Location />
                ProxyPass http://192.168.1.50/
                ProxyPassReverse http://192.168.1.50/
        </Location>
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/mysub>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/www/mysub/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

Saída de apache2ctl -S

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server 66-152-109-110.tvc-ip.com (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost 66-152-109-110.tvc-ip.com (/etc/apache2/sites-enabled/000-default:1)
         port 80 namevhost domain.com (/etc/apache2/sites-enabled/domain:1)
         port 80 namevhost mysub.domain.com (/etc/apache2/sites-enabled/mysub:1)
Syntax OK
    
por JoshP 01.08.2012 / 01:48

2 respostas

3

Você está muito perto!

Algumas notas:

  • RewriteCond %{HTTP_HOST} ^mysub.domain.com/* - A variável HTTP_HOST contém apenas mysub.domain.com , não o restante do caminho.

    Esta regra, na verdade, corresponde, mas acidentalmente - não há nenhum caractere / , mas o modificador * se aplica ao caractere / , significando "repetir o / 0 para infinitas vezes".

    O Apache usa o regex compatível com perl - para corresponder ao host exato, ele deve ficar assim:

    RewriteCond %{HTTP_HOST} ^mysub\.domain\.com$
    
  • RewriteRule .* http://192.168.x.x/ [P,L] - Só carrega a página inicial porque não inclui o resto do caminho passado - isso deve ser feito manualmente ao usar o sinal [P] de RewriteRule .

    Isso deve funcionar:

    RewriteRule (.*) http://192.168.x.x/$1 [P,L]
    
  • A configuração ProxyPass está quase certa, exceto que está sendo substituída pela configuração no arquivo .htaccess , por isso não está sendo usada. Usar .htaccess é ruim para desempenho e potencialmente problemático para segurança - veja a recomendação na documentação do Apache aqui .

    Provavelmente, a melhor abordagem é excluir o arquivo .htaccess imediatamente e usar apenas ProxyPass . Mude sua configuração um pouco ...

    <Location />
       ProxyPass http://192.168.x.x/
       ProxyPassReverse http://192.168.x.x/
    </Location>
    

    ... e mova-o do seu httpd.conf para o bloco <VirtualHost> que está servindo ao subdomínio.

    Com as barras à direita correspondentes e não mais .htaccess , isso deve funcionar!

por 01.08.2012 / 02:41
0

Esta foi a peça final do quebra-cabeça. Encontrou-a como resposta em esta pergunta.

A solução é ter isso em /etc/apache2/mods-enabled/proxy.conf :

<IfModule mod_proxy.c>
ProxyRequests Off
<Proxy *>
  AddDefaultCharset off 
  Order deny,allow
  Allow from all 
</Proxy>
    
por 03.08.2012 / 14:08