Host virtual do Apache baseado em * source * IP

7

É possível configurar o Apache para diferentes hosts virtuais com base no IP source ? (ou seja, mesma interface, mesmo nome de host, mas dois hosts virtuais diferentes, com conteúdo diferente, com base no IP source .

A motivação para isso é que meu endereço IP possa acessar o site corretamente, mas que todos os outros recebam a página de espera. A solução convencional parece ser usar o mod_rewrite para direcionar os visitantes para uma página separada dentro do mesmo docroot, mas eu gostaria de usar um docroot completamente diferente para a página holding.

    
por ithinkihaveacat 02.08.2011 / 13:21

5 respostas

5

Eu não sei se isso é possível (sem mod_rewrite, pelo menos) no nível do Apache.

Aqui está outra ideia. E se você configurar dois hosts virtuais Apache e, em seguida, usar o iptables para encaminhar de forma transparente o visitante para o host virtual correto? Algo como

iptables -A PREROUTING -t nat -i eth0 -p tcp -s your.ip.address -d your.server --dport 80 -j DNAT --to-destination your.actual.site:someport
iptables -A PREROUTING -t nat -i eth0 -p tcp ! -s your.ip.address -d your.server --dport 80 -j DNAT --to-destination your.holding.site:someport

Ou algo similar. :)

    
por 02.08.2011 / 13:35
8

Não seria realmente um host virtual diferente. Mas usando algo como mod_rewrite ou mod_alias você pode exibir conteúdo de qualquer pasta para a qual tenha definido as permissões apropriadas. Há apenas um docroot, mas você pode efetivamente mudar isso na hora.

Uma maneira de fazer isso pode ser:

<VirtualHost *.80>
    ServerName example.com
    ...
    DocumentRoot "/path/to/root"
    <Directory "/path/to/root">
       ...
    </Directory>
    <Directory "/path/to/not/root">
       Order allow,deny
       #replace with your IP
       Allow from 192.168.0.100 
       ...
    </Directory>
    RewriteEngine On
    #Rewrite to alternate path if IP address matches
    RewriteCond %{REMOTE_ADDR} ^192\.168\.0\.100$
    RewriteRule ^/(.*)$ /path/to/not/root/$1
<VirtualHost>

Observe, porém, que provavelmente seria um pouco mais limpo lidar com isso com um subdomínio dev.

    
por 02.08.2011 / 14:33
3

Apache 2.3 ou posterior

Com o Apache 2.3 ou posterior, você pode aparentemente fazer algo assim (testado):

<VirtualHost *:80>
    ServerName www.example.com

    <If "-R '10.10.10.10'">
        # The next version of the website...
        Alias /favicon.ico /home/ubuntu/website-new/favicon.ico
        Alias /static/ /home/ubuntu/static/
        WSGIScriptAlias / /home/ubuntu/website-new/main/wsgi.py
    </If>
    <Else>
        # The standard version (e.g. holding page).
        Alias /favicon.ico /home/ubuntu/website/favicon.ico
        Alias /static/ /home/ubuntu/static/
        WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py
    </Else>

    # and so on...

</VirtualHost>

Apache 2.2 ou anterior

Atualização: esta não é uma boa solução. Veja abaixo.

Você tem que fazer um hack como este. Observe o [PT] que significa "passthrough". Sem isso, um redirecionamento HTTP real é enviado de volta ao cliente, o que provavelmente não é o que você deseja. A [OR] thing (que significa "ou") mostra como combinar vários endereços.

Alias /next/favicon.ico /home/ubuntu/website-new/favicon.ico
Alias /next/static/ /home/ubuntu/static/
WSGIScriptAlias /next /home/ubuntu/website-new/main/wsgi.py

Alias /favicon.ico /home/ubuntu/website/favicon.ico
Alias /static/ /home/ubuntu/static/
WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py

# Rewrite for our IP.
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^80\.4\.170\.209$ [OR]
RewriteCond %{REMOTE_ADDR} ^94\.193\.52\.157$
RewriteRule ^/(.*) /next/$1 [PT]

Você precisa ativar mod_rewrite , o que você pode fazer no Debian / Ubuntu com este comando:

sudo a2enmod rewrite

Note que este método não bane completamente outras pessoas de acessar o seu site de teste, então você provavelmente desejará adicionar alguma segurança, ou apenas escolher um prefixo mais obscuro que next .

Atualização no método mod_rewrite.

Existem alguns problemas com este método. Primeiro, o Django não funciona com dois sites no mesmo processo como este, você precisa seguir as instruções em esta resposta .

Em segundo lugar, o mod_rewrite não funciona com POST requests ! Todos os POST s são alterados silenciosamente para GET e os dados da postagem são descartados. Muito frustrante! Por isso eu recomendo que você use o ...

versão iptables

Basta executar os servidores em duas portas diferentes. Este inclui o material do WSGI para ter dois sites separados do django.

<VirtualHost *:80>
    ServerName www.example.com

    Alias /favicon.ico /home/ubuntu/alpha/favicon.ico
    Alias /static/ /home/ubuntu/alpha/static/

    WSGIDaemonProcess alpha_wsgi user=www-data group=www-data
    WSGIScriptAlias / /home/ubuntu/alpha/alpha/wsgi.py
    WSGIProcessGroup alpha_wsgi

    ServerAdmin [email protected]

    ErrorLog ${APACHE_LOG_DIR}/error.log

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

    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:1222>
    ServerName www.example.com

    Alias /favicon.ico /home/ubuntu/main/favicon.ico
    Alias /static/ /home/ubuntu/main/static/

    WSGIDaemonProcess main_wsgi user=www-data group=www-data
    WSGIScriptAlias / /home/ubuntu/main/main/wsgi.py
    WSGIProcessGroup main_wsgi

    ServerAdmin [email protected]

    ErrorLog ${APACHE_LOG_DIR}/error.log

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

    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Em seguida, você pode usar este comando iptables para rotear solicitações do seu endereço IP na porta 80 para a porta 1222:

sudo iptables -A PREROUTING -t nat -p tcp -s your.ip.address --dport 80 -j DNAT --to-destination :1222

Altere -A para -D para remover a regra.

Note que os documentos sugerem que você precisa adicionar mais comandos Listen e NameVirtualHost , mas eu realmente descobri que ele funciona sem eles, e adicioná-los fez com que ele quebrasse (pelo menos no Ubuntu).

    
por 06.11.2012 / 16:16
2

AFAIK, a única maneira de fazer isso é ligar simbolicamente um local dentro da raiz do documento ao seu conteúdo fora da raiz do documento e, em seguida, reescrever a solicitação para isso.

    
por 02.08.2011 / 12:46
0

Como @Timmmm disse, mas corrigindo a declaração do ipmatch (observe o '10 .10.10.10 '):     Nome do servidor www.example.com

<If "%{REMOTE_ADDR} -ipmatch '10.10.10.10'">
    # The next version of the website...
    Alias /favicon.ico /home/ubuntu/website-new/favicon.ico
    Alias /static/ /home/ubuntu/static/
    WSGIScriptAlias / /home/ubuntu/website-new/main/wsgi.py
</If>
<Else>
    # The standard version (e.g. holding page).
    Alias /favicon.ico /home/ubuntu/website/favicon.ico
    Alias /static/ /home/ubuntu/static/
    WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py
</Else>

# and so on...

Caso contrário, ele mostrará o erro:

Cannot parse condition clause: -ipmatch requires subnet/netmask as constant argument
    
por 11.05.2016 / 23:02