Wirtualny host Apache oparty na * źródłowym * adresie IP


Czy można skonfigurować Apache dla różnych wirtualnych hostów w oparciu o

źródło

IP? (tj. ten sam interfejs, ta sama nazwa hosta, ale dwa różne wirtualne hosty z różną zawartością na podstawie

źródło

IP.)
Motywacją jest to, że mój adres IP może uzyskać dostęp do samej witryny, ale wszyscy inni mają dostęp do strony przechowywania. Wydaje się, że typowym rozwiązaniem jest użycie mod_rewrite do kierowania odwiedzających na oddzielną stronę w tym samym katalogu głównym, ale zamiast tego chciałbym użyć zupełnie innego katalogu głównego dla strony przechowywania.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W rzeczywistości nie byłby to kolejny wirtualny host. Ale używając czegoś takiego jak

mod_rewrite
http://httpd.apache.org/docs/c ... .html
lub

mod_alias
http://httpd.apache.org/docs/c ... .html
możesz udostępniać zawartość z dowolnego folderu, dla którego ustawiłeś odpowiednie uprawnienia. Jest tylko jeden dokroot, ale możesz go zmienić w locie.
Jeden sposób, aby to zrobić:
<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>

Zauważ, że prawdopodobnie byłoby trochę czystsze rozwiązanie tego problemu z subdomeną dev.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie wiem, czy jest to możliwe (przynajmniej bez mod_rewrite) na poziomie Apache.
Oto inny pomysł. Co się stanie, jeśli skonfigurujesz dwa wirtualne hosty Apache, a następnie użyjesz iptables do przezroczystego przekierowywania odwiedzających na właściwy wirtualny host? Raczej
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

Albo coś podobnego. :)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Apache 2.3 lub nowszy
>
W Apache 2.3 lub nowszym możesz najwyraźniej zrobić coś takiego (przetestowane):
<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 lub starszy
>Aktualizacja: to nie jest najlepsze rozwiązanie. Zobacz poniżej.

Musisz zrobić takiego hakera. Uwaga
         [PT]
co oznacza „przez”. Bez tego rzeczywiste przekierowanie HTTP jest odsyłane z powrotem do klienta, co prawdopodobnie nie jest tym, czego chcesz. W
         [OR]
rzecz (oznaczająca „lub”) pokazuje, jak dopasować wiele adresów.
Alias/next/favicon.ico/home/ubuntu/website-new/favicon.ico
Alias/next/static//home/ubuntu/static/
WSGIScriptAlias/next/home/ubuntu/website-new/main/wsgi.pyAlias/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]

Musisz włączyć
         mod_rewrite
co możesz zrobić w Debianie/Ubuntu za pomocą tego polecenia:
sudo a2enmod rewrite

Zwróć uwagę, że ta metoda nie uniemożliwia całkowicie innym osobom dostępu do Twojej witryny testowej, więc prawdopodobnie chcesz dodać trochę zabezpieczeń lub po prostu wybrać bardziej niejasny prefiks niż
         next
.

Zaktualizowana metoda mod_rewrite.
>
Ta metoda ma kilka problemów. Po pierwsze, Django nie działa z dwiema witrynami w tym samym procesie, co ten, musisz postępować zgodnie z instrukcjami zawartymi w

ta odpowiedź
https://stackoverflow.com/a/6591232/265521
.
Po drugie

mod_rewrite nie działa z
           POST
Zapytania

! Wszystko
         POST
cicho zmienia się na
         GET
a dane wiadomości zostaną usunięte. Bardzo nieprzyjemne! Dlatego polecam używać ...

wersja iptables
>
Po prostu uruchom serwery na dwóch różnych portach. Ten zawiera rzeczy WSGI, które mają mieć dwie oddzielne strony 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 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>

Następnie możesz tego użyć
         iptables
polecenie, aby skierować żądania z adresu IP do portu 80 do portu 1222:
sudo iptables -A PREROUTING -t nat -p tcp -s your.ip.address --dport 80 -j DNAT --to-destination :1222

+ Zmień
         -A
do
         -D
aby usunąć regułę.
Zauważ, że dokumentacja sugeruje dodanie dodatkowych plików
         Listen
i
         NameVirtualHost
poleceń, ale stwierdziłem, że działało bez nich, a dodanie ich spowodowało zerwanie (przynajmniej w ubuntu).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

AFAIK, jedynym sposobem na to jest symboliczne połączenie lokalizacji w katalogu głównym dokumentu z zawartością poza katalogiem głównym, a następnie przepisanie żądania w tym celu.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak powiedział @Timmmm, ale naprawiono instrukcję ipmatch (zwróć uwagę na „10 .10.10.10”): nazwa_serwera 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...

Bo inaczej pokaże błąd:
Cannot parse condition clause: -ipmatch requires subnet/netmask as constant argument

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się