* Kaynak * IP tabanlı Apache sanal ana bilgisayarı


9

Apache'yi kaynak IP'ye göre farklı sanal ana bilgisayarlar için yapılandırmak mümkün mü ? (örneğin, aynı arabirim, aynı ana bilgisayar adı, ancak kaynak IP'sine göre farklı içeriğe sahip iki farklı sanal ana bilgisayar .)

Bunun nedeni, IP adresimin siteye düzgün bir şekilde erişebilmesi, ancak herkesin tutma sayfasını almasıdır. Geleneksel çözüm, ziyaretçileri aynı doktora içindeki ayrı bir sayfaya yönlendirmek için mod_rewrite kullanmak gibi görünüyor, ancak bunun yerine tutma sayfası için tamamen farklı bir doktora kullanmak istiyorum.


BTW, neden sunucuda kendiniz için bu mantığa ihtiyacınız var ? Ana bilgisayar dosyanızı kullanarak etki alanını yalnızca bir test sunucusunun (veya kendi bilgisayarınızın) IP'si ile eşleyebilirsiniz.
Dan Grossman

işleyecek birkaç ismin var mı yoksa sadece bir tane var mı? adlarla veya IP ile çalışabildiğiniz için (Sanal ana bilgisayarları tanımlayın).
regilero

Farklı bir doktor kökü neden özel bir neden?
anthonysomerset

OP'nin belirtilen mantığı mantıklı değil (bir tutma sayfası yeniden yazma ile harika çalışıyor), örneğin, bir siteyi yeniden çalışıyorsanız, yeniden çalışmayı barındırmanın bir yoluna ihtiyacınız varsa ve alt alanların var olduğunu bilmiyorsanız, bu şekilde yapmaya karar verin.
womble

Siz hariç herkese erişimi engellemek için İzin Ver / Reddet satırlarını kullanabilirsiniz ve 403 hataları için özel bir hata belgesine sahip olabilirsiniz (Bir dizine koyduğunuzdan ve bu dizine erişime izin verdiğinizden emin olun, aksi takdirde hata belgesi de 403 olacaktır) veya tutma sayfası olabilir / yeniden yazma kuralları kullanarak koşullarını yeniden yazmak ya da example.com sonra dev.example.com gibi bir alt etmek için lansman öncesi / test siteyi taşımak
Leke

Yanıtlar:


5

Apache düzeyinde (mod_rewrite olmadan) mümkün olup olmadığını bilmiyorum.

İşte başka bir fikir. İki Apache sanal ana bilgisayarı ayarlayıp ardından iptables'ı ziyaretçiyi sanal ana bilgisayarı düzeltmek üzere şeffaf bir şekilde iletmek için kullanırsanız ne olur? Gibi bir şey

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

Veya benzeri. :)


Bunun en kötü seçenek olacağını söyleyebilirim.
womble

8

Gerçekten farklı bir sanal sunucu olmazdı. Ancak mod_rewrite veya mod_alias gibi bir şey kullanarak , uygun izinleri ayarladığınız herhangi bir klasörden içerik sunabilirsiniz. Sadece bir doktora var, ama bunu anında etkili bir şekilde değiştirebilirsiniz.

Bunu yapmanın bir yolu şunlar olabilir:

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

Yine de, bunu bir dev alt etki alanı ile ele almanın biraz daha temiz olacağını unutmayın.


4

Apache 2.3 veya üstü

Apache 2.3 veya üstü ile görünüşe göre böyle bir şey yapabilirsiniz (test edilmiş):

<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 veya öncesi

Güncelleme: Bu iyi bir çözüm değil. Aşağıya bakınız.

Böyle bir hack yapmalısın. Not [PT]"geçidi" anlamına gelen. Bu olmadan, istemciye gerçek bir HTTP yönlendirmesi gönderilir, bu muhtemelen istediğiniz şey değildir. [OR]Gösterileri ( "veya" anlamına gelir) bir şey nasıl birden çok adres eşleşecek.

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]

mod_rewriteDebian / Ubuntu'da yapabileceğinizi şu komutla etkinleştirmeniz gerekir :

sudo a2enmod rewrite

Bu yöntemin diğer kişilerin test sitenize erişmesini tamamen yasaklamadığından, muhtemelen biraz güvenlik eklemek veya sadece daha belirsiz bir önek seçmek isteyeceksiniz next.

Mod_rewrite yönteminde güncelleme.

Bu yöntemle ilgili birkaç sorun var. İlk olarak, Django bunun gibi aynı süreçte iki site ile çalışmaz, bu cevaptaki talimatları izlemeniz gerekir .

İkincisi mod_rewrite POSTisteklerle çalışmaz ! Tümü POSTsessizce olarak değiştirilir GETve kayıt verileri atılır. Çok sinir bozucu! Bu nedenle ...

iptables sürümü

Sunucuları iki farklı bağlantı noktasında çalıştırın. Bu, iki ayrı django sitesine sahip olmak için WSGI öğelerini içerir.

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

Ardından, iptables80 numaralı bağlantı noktasındaki ip adresinizden 1222 numaralı bağlantı noktasına istekleri yönlendirmek için bu komutu kullanabilirsiniz :

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

Değişim -Aiçin -Dkuralı kaldırmak için.

Dokümanların ek Listenve NameVirtualHostkomutlar eklemenizi önerdiğini unutmayın , ancak aslında onlarsız çalıştığını ve onları eklemenin mola verdiğini buldum (en azından ubuntu'da).


2.3+ için cevabınız Alias cannot occur within <Directory/Location/Files> sectionherhangi bir düzeltme veriyor mu? Buna gerçekten ihtiyacım var: $
Gizmo

2

AFAIK, bunu yapmanın tek yolu, belge kökü içindeki bir konumu, belge kökü dışındaki içeriğinize bağlamak, ardından isteği yeniden yazmaktır.


1

@Timmmm'in dediği gibi, ancak ipmatch deyimini düzeltir ('10 .10.10.10 '' u not edin): SunucuAdı 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...

Aksi takdirde hatayı gösterecektir:

Cannot parse condition clause: -ipmatch requires subnet/netmask as constant argument
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.