Apache virtual host berdasarkan * sumber * IP

9

Apakah mungkin untuk mengkonfigurasi Apache untuk host virtual berbeda berdasarkan IP sumber ? (Yaitu antarmuka yang sama, nama host yang sama, tetapi dua host virtual yang berbeda, dengan konten yang berbeda, berdasarkan IP sumber .)

Motivasi untuk ini adalah agar alamat IP saya dapat mengakses situs dengan semestinya, tetapi semua orang mendapat halaman holding. Solusi konvensional tampaknya menggunakan mod_rewrite untuk mengarahkan pengunjung ke halaman terpisah dalam dokumen yang sama, tetapi saya ingin menggunakan dokumen yang sama sekali berbeda untuk halaman holding.

ithinkihaveacat
sumber
BTW, mengapa Anda perlu logika ini untuk diri sendiri di server? Anda dapat memetakan domain ke IP server pengujian (atau komputer Anda sendiri) hanya untuk Anda sendiri menggunakan file host Anda.
Dan Grossman
apakah Anda memiliki beberapa nama untuk ditangani atau hanya satu? karena Anda dapat bekerja (menentukan Virtualhosts) dengan nama atau dengan IP.
regilero
ada alasan khusus mengapa root doc berbeda?
anthonysomerset
Alasan OP yang dinyatakan tidak masuk akal (halaman holding berfungsi baik dengan penulisan ulang), tetapi jika Anda, katakanlah, mengerjakan ulang situs, membutuhkan cara untuk meng-host ulang, dan tidak tahu bahwa subdomain ada, Anda mungkin memutuskan untuk melakukannya dengan cara ini.
womble
Anda bisa menggunakan garis Perbolehkan / Tolak untuk memblokir akses ke semua orang kecuali Anda dan memiliki dokumen kesalahan khusus untuk 403 kesalahan (Pastikan Anda meletakkannya di direktori dan mengizinkan akses ke direktori itu, kalau tidak, dokumen kesalahan juga akan 403), atau gunakan aturan penulisan ulang / kondisi penulisan ulang, atau pindahkan situs pra-peluncuran / pengujian Anda ke subdomain seperti dev.example.com lalu example.com dapat memiliki halaman penampung
Smudge

Jawaban:

5

Saya tidak tahu apakah itu mungkin (tanpa mod_rewrite, tetap) di tingkat Apache.

Ini ide lain. Bagaimana jika Anda mengatur dua host virtual Apache dan kemudian menggunakan iptables untuk secara transparan meneruskan pengunjung untuk memperbaiki host virtual? Sesuatu seperti

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

Atau yang serupa. :)

Janne Pikkarainen
sumber
Saya akan mengatakan ini akan menjadi pilihan paling tidak terburuk.
womble
8

Itu tidak akan benar-benar menjadi tuan rumah virtual yang berbeda. Tetapi menggunakan sesuatu seperti mod_rewrite atau mod_alias Anda dapat menayangkan konten dari folder apa pun yang telah Anda setel izin yang sesuai. Hanya ada satu dokumen, tetapi Anda dapat secara efektif mengubahnya dengan cepat.

Salah satu cara untuk melakukannya mungkin:

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

Harap perhatikan bahwa mungkin akan sedikit lebih bersih untuk menangani ini dengan subdomain dev.

matthew
sumber
4

Apache 2.3 atau lebih baru

Dengan Apache 2.3 atau yang lebih baru Anda dapat melakukan sesuatu seperti ini (diuji):

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

Pembaruan: Ini bukan solusi yang baik. Lihat di bawah.

Anda harus melakukan peretasan seperti ini. Perhatikan [PT]yang merupakan singkatan dari "passthrough". Tanpa itu, pengalihan HTTP yang sebenarnya dikirim kembali ke klien, yang mungkin bukan yang Anda inginkan. The [OR]hal (yang merupakan singkatan dari "atau") menunjukkan bagaimana untuk mencocokkan beberapa alamat.

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]

Anda harus mengaktifkan mod_rewriteyang dapat Anda lakukan pada Debian / Ubuntu dengan perintah ini:

sudo a2enmod rewrite

Perhatikan bahwa metode ini tidak sepenuhnya melarang orang lain mengakses situs pengujian Anda, jadi Anda mungkin ingin menambahkan beberapa keamanan, atau hanya memilih awalan yang lebih tidak jelas daripada next.

Pembaruan pada metode mod_rewrite.

Ada beberapa masalah dengan metode ini. Pertama, Django tidak bekerja dengan dua situs dalam proses yang sama seperti ini, Anda harus mengikuti instruksi dalam jawaban ini .

Kedua mod_rewrite tidak berfungsi dengan POSTpermintaan ! Semua POSTs diam-diam diubah ke GETdan data posting dibuang. Sangat membuat frustrasi! Karena itu saya sarankan Anda menggunakan ...

versi iptables

Cukup jalankan server pada dua port yang berbeda. Yang ini termasuk hal-hal WSGI untuk memiliki dua situs Django terpisah.

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

Kemudian Anda dapat menggunakan iptablesperintah ini untuk merutekan permintaan dari alamat ip Anda di port 80 ke port 1222:

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

Ubah -Ake -Duntuk menghapus aturan.

Perhatikan bahwa dokumen menyarankan Anda perlu menambahkan tambahan Listendan NameVirtualHostperintah, tetapi saya benar-benar menemukan bahwa itu berfungsi tanpa mereka, dan menambahkan mereka membuatnya rusak (setidaknya di ubuntu).

Timmmm
sumber
Jawaban Anda untuk 2.3+ memberikan Alias cannot occur within <Directory/Location/Files> sectionperbaikan? Saya sangat membutuhkan ini: $
Gizmo
2

AFAIK, satu-satunya cara untuk melakukan ini adalah dengan menghubungkan lokasi dalam root dokumen ke konten Anda di luar root dokumen, kemudian menulis ulang permintaan itu.

Dan Grossman
sumber
1

Seperti kata @Timmmm, tetapi mengoreksi pernyataan ipmatch (perhatikan '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...

Karena jika tidak maka akan muncul kesalahan:

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