Virtueller Apache-Host basierend auf * Quell * IP

9

Ist es möglich, Apache für verschiedene virtuelle Hosts basierend auf der Quell- IP zu konfigurieren ? (dh gleiche Schnittstelle, gleicher Hostname, aber zwei verschiedene virtuelle Hosts mit unterschiedlichem Inhalt, basierend auf der Quell- IP.)

Die Motivation dafür ist, dass meine IP-Adresse auf die richtige Site zugreifen kann, aber alle anderen die Holding-Seite erhalten. Die herkömmliche Lösung scheint darin zu bestehen, mod_rewrite zu verwenden, um Besucher auf eine separate Seite innerhalb derselben Docroot zu leiten, aber ich möchte stattdessen eine völlig andere Docroot für die Holding-Seite verwenden.

ithinkihaveacat
quelle
Übrigens, warum brauchen Sie diese Logik für sich selbst auf dem Server? Sie können die Domäne mithilfe Ihrer Hosts-Datei nur für sich selbst der IP eines Testservers (oder Ihres eigenen Computers) zuordnen.
Dan Grossman
Haben Sie mehrere Namen oder nur einen? wie Sie mit Namen oder mit IP arbeiten können (definieren Sie die Virtualhosts).
Regilero
Gibt es einen bestimmten Grund, warum ein anderes Dokument root?
Anthonysomerset
Die vom OP angegebenen Gründe sind nicht sinnvoll (eine Holding-Seite eignet sich hervorragend zum Umschreiben). Wenn Sie jedoch beispielsweise eine Site überarbeiten, eine Möglichkeit zum Hosten der Überarbeitung benötigen und nicht wissen, dass Subdomains vorhanden sind, können Sie dies möglicherweise tun entscheide dich so zu machen.
Womble
Sie können die Zeilen Zulassen / Verweigern verwenden, um den Zugriff auf alle außer Ihnen zu blockieren und ein benutzerdefiniertes Fehlerdokument für 403-Fehler zu haben (Stellen Sie sicher, dass Sie es in einem Verzeichnis ablegen und den Zugriff auf dieses Verzeichnis zulassen, andernfalls wird das Fehlerdokument ebenfalls 403) oder Verwenden Sie Umschreiberegeln / Umschreibbedingungen oder verschieben Sie Ihre Pre-Launch- / Test-Site in eine Subdomain wie dev.example.com, dann könnte example.com die Holding-Seite haben
Smudge

Antworten:

5

Ich weiß nicht, ob das in Apache-Level möglich ist (jedenfalls ohne mod_rewrite).

Hier ist eine andere Idee. Was ist, wenn Sie zwei virtuelle Apache-Hosts einrichten und dann iptables verwenden, um Besucher transparent an den korrekten virtuellen Host weiterzuleiten? Etwas wie

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

Oder etwas ähnliches. :) :)

Janne Pikkarainen
quelle
Ich würde sagen, dass dies die am wenigsten schlimmste Option sein wird.
womble
8

Es wäre nicht wirklich ein anderer virtueller Host. Mit mod_rewrite oder mod_alias können Sie jedoch Inhalte aus jedem Ordner bereitstellen , für den Sie die entsprechenden Berechtigungen festgelegt haben. Es gibt nur eine Docroot, aber Sie können diese effektiv im laufenden Betrieb ändern.

Ein Weg, dies zu tun, könnte sein:

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

Beachten Sie jedoch, dass es wahrscheinlich etwas sauberer wäre, dies mit einer Dev-Subdomain zu handhaben.

Matthew
quelle
4

Apache 2.3 oder höher

Mit Apache 2.3 oder höher können Sie anscheinend so etwas tun (getestet):

<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 oder früher

Update: Dies ist keine gute Lösung. Siehe unten.

Du musst so einen Hack machen. Beachten Sie das, [PT]was für "Passthrough" steht. Ohne sie wird eine tatsächliche HTTP-Umleitung an den Client zurückgesendet, was wahrscheinlich nicht das ist, was Sie wollen. Das [OR]Ding (was für "oder" steht) zeigt, wie mehrere Adressen abgeglichen werden.

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]

Sie müssen aktivieren, mod_rewritewas Sie unter Debian / Ubuntu mit diesem Befehl tun können:

sudo a2enmod rewrite

Beachten Sie, dass diese Methode anderen Personen den Zugriff auf Ihre Testsite nicht vollständig verbietet. Daher sollten Sie wahrscheinlich etwas Sicherheit hinzufügen oder einfach ein dunkleres Präfix als wählen next.

Update der mod_rewrite-Methode.

Bei dieser Methode gibt es einige Probleme. Erstens funktioniert Django nicht mit zwei Sites im selben Prozess wie diesem. Sie müssen den Anweisungen in dieser Antwort folgen .

Zweitens funktioniert mod_rewrite nicht mit POSTAnfragen ! Alle POSTs werden stillschweigend in geändert GETund die Postdaten werden verworfen. Sehr frustrierend! Deshalb empfehle ich Ihnen die ...

iptables Version

Führen Sie die Server einfach an zwei verschiedenen Ports aus. Dieser enthält das WSGI-Zeug, um zwei separate Django-Sites zu haben.

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

Mit diesem iptablesBefehl können Sie dann Anforderungen von Ihrer IP-Adresse an Port 80 an Port 1222 weiterleiten:

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

Wechseln Sie -Azu -D, um die Regel zu entfernen.

Beachten Sie, dass die Dokumente vorschlagen, dass Sie zusätzliche Listenund NameVirtualHostBefehle hinzufügen müssen , aber ich habe tatsächlich festgestellt, dass es ohne sie funktioniert, und das Hinzufügen von Befehlen hat es kaputt gemacht (zumindest in Ubuntu).

Timmmm
quelle
Ihre Antwort für 2.3+ gibt Alias cannot occur within <Directory/Location/Files> sectioneine Lösung? Ich brauche das wirklich: $
Gizmo
2

AFAIK, die einzige Möglichkeit, dies zu tun, besteht darin, einen Speicherort innerhalb des Dokumentstamms mit Ihrem Inhalt außerhalb des Dokumentstamms zu verknüpfen und die Anforderung dann neu zu schreiben.

Dan Grossman
quelle
1

Wie @Timmmm sagte, aber die ipmatch-Anweisung korrigiert (beachten Sie die '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...

Denn sonst wird der Fehler angezeigt:

Cannot parse condition clause: -ipmatch requires subnet/netmask as constant argument
olivervbk
quelle