Host virtuale Apache basato su * source * IP


9

È possibile configurare Apache per diversi host virtuali in base all'IP di origine ? (ovvero stessa interfaccia, stesso nome host, ma due host virtuali diversi, con contenuto diverso, basato sull'IP di origine ).

La motivazione di ciò è che il mio indirizzo IP può accedere al sito correttamente, ma che tutti gli altri ottengono la pagina di attesa. La soluzione convenzionale sembra essere quella di utilizzare mod_rewrite per indirizzare i visitatori verso una pagina separata all'interno della stessa docroot, ma mi piacerebbe invece utilizzare una docroot completamente diversa per la pagina di mantenimento.


A proposito, perché hai bisogno di questa logica per te stesso sul server? Puoi mappare il dominio sull'IP di un server di test (o sul tuo computer) solo per te stesso usando il tuo file hosts.
Dan Grossman,

hai diversi nomi da gestire o solo uno? come puoi lavorare (definisci i VirtualHosts) con nomi o con IP.
regilero,

qualche motivo particolare per cui una diversa radice del documento?
anthonysomerset,

La logica dichiarata del PO non ha senso (una pagina trattenuta funziona alla grande con una riscrittura), ma se, ad esempio, stavi rielaborando un sito, avessi bisogno di un modo per ospitare la rilavorazione e non sapessi che esistevano sottodomini, potresti decidere di farlo in questo modo.
Womble

È possibile utilizzare Consenti / Nega righe per bloccare l'accesso a tutti tranne te e disporre di un documento di errore personalizzato per errori 403 (Assicurarsi di inserirlo in una directory e consentire l'accesso a tale directory, altrimenti anche il documento di errore sarà 403), oppure usa le regole di riscrittura / riscrivi le condizioni o sposta il tuo sito di pre-lancio / test in un sottodominio come dev.example.com, quindi example.com potrebbe avere la pagina di attesa
Sfumatura

Risposte:


5

Non so se sia possibile (senza mod_rewrite, comunque) a livello di Apache.

Ecco un'altra idea. Cosa succede se si configurano due host virtuali Apache e quindi si utilizza iptables per inoltrare in modo trasparente i visitatori per correggere l'host virtuale? Qualcosa di simile a

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

O qualcosa di simile. :)


Direi che questa sarà l'opzione meno peggiore.
Womble

8

Non sarebbe davvero un host virtuale diverso. Ma usando qualcosa come mod_rewrite o mod_alias puoi pubblicare contenuti da qualsiasi cartella per la quale hai impostato le autorizzazioni appropriate. C'è solo un docroot, ma puoi effettivamente cambiarlo al volo.

Un modo per farlo potrebbe essere:

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

Nota però che probabilmente sarebbe un po 'più pulito gestirlo con un sottodominio dev.


4

Apache 2.3 o successivo

Con Apache 2.3 o versioni successive puoi apparentemente fare qualcosa del genere (testato):

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

Aggiornamento: questa non è una buona soluzione. Vedi sotto.

Devi fare un trucco come questo. Nota [PT]che sta per "passthrough". Senza di esso, un reindirizzamento HTTP effettivo viene inviato al client, che probabilmente non è quello che desideri. La [OR]cosa (che sta per "o") mostra come abbinare più indirizzi.

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]

Devi abilitare mod_rewriteciò che puoi fare su Debian / Ubuntu con questo comando:

sudo a2enmod rewrite

Nota che questo metodo non impedisce completamente ad altre persone di accedere al tuo sito di test, quindi probabilmente vorrai aggiungere un po 'di sicurezza o semplicemente scegliere un prefisso più oscuro di next.

Aggiornamento sul metodo mod_rewrite.

Ci sono un paio di problemi con questo metodo. Innanzitutto, Django non funziona con due siti nello stesso processo come questo, è necessario seguire le istruzioni in questa risposta .

In secondo luogo mod_rewrite non funziona con le POSTrichieste ! Tutti POSTi messaggi vengono silenziosamente modificati GETe i dati di post vengono eliminati. Molto frustrante! Pertanto ti consiglio di usare il ...

versione di iptables

Basta eseguire i server su due porte diverse. Questo include le cose WSGI per avere due siti django separati.

<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 info@example.com

    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 info@example.com

    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>

Quindi è possibile utilizzare questo iptablescomando per instradare le richieste dal proprio indirizzo IP dalla porta 80 alla porta 1222:

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

Passare -Aa -Dper rimuovere la regola.

Si noti che i documenti suggeriscono che è necessario aggiungere ulteriori comandi Listene NameVirtualHost, ma in realtà ho scoperto che funziona senza di essi, e l'aggiunta di essi lo ha fatto rompere (almeno in Ubuntu).


La tua risposta per 2.3+ fornisce Alias cannot occur within <Directory/Location/Files> sectionqualche soluzione? Ne ho davvero bisogno: $
Gizmo,

2

AFAIK, l'unico modo per farlo è collegare simbolicamente una posizione all'interno della radice del documento al contenuto esterno alla radice del documento, quindi riscrivere la richiesta a tale.


1

Come ha detto @Timmmm, ma correggendo l'istruzione ipmatch (notare il '10 .10.10.10 '): ServerName 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...

Perché altrimenti mostrerà l'errore:

Cannot parse condition clause: -ipmatch requires subnet/netmask as constant argument
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.