Bagaimana cara menonaktifkan VirtualHost default di apache2?

10

Dalam desain apache2, setiap permintaan http dengan Host yang tidak dikenal akan diarahkan ke VirtualHost pertama yang dimuat. Apakah ada cara untuk menonaktifkan fitur ini? Mengatakan berbeda, saya ingin memiliki server web di mana pengguna hanya dapat secara eksplisit bernama definisi VirtualHost. Nama host lain yang tidak disebutkan secara eksplisit dalam baris ServerName atau ServerAlias ​​harus diabaikan secara diam-diam.

Apakah ini mungkin?

Listen 80
NameVirtualHost *

<VirtualHost _default_:*>
# Anything matching this host should be silently ignored.
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example1
ServerName www.example.com
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example2
ServerName www.example.org
</VirtualHost>

Pembaruan: Seperti yang disarankan di bawah dan di tempat lain, dengan diam-diam mengabaikan permintaan mungkin bukan ide yang baik dan mungkin mematahkan RFC untuk HTTP. Namun, karena host virtual dirancang untuk mensimulasikan memiliki beberapa server HTTP fisik yang terpisah, pendekatan pengabaian senyap tampaknya tidak masuk akal bagi saya. Itu akan sama dengan virtual hosting berbasis IP dan firewall dari beberapa IP (mungkin tidak untuk semua klien).

Harvey
sumber

Jawaban:

4

Saya tidak yakin bahwa "gagal secara diam-diam" adalah ide yang bagus. Anda harus memberi klien setidaknya beberapa indikasi tentang apa yang terjadi. Mungkin Anda bisa mengirim kesalahan "hilang" http 410. Sesuatu seperti ini harus melakukan trik:

RewriteRule ^.*$ - [G]

Selain itu, Anda harus dapat menentukan dokumen kesalahan 410 kustom, yang bisa saja halaman html kosong.

EEAA
sumber
Saya akhirnya menemukan solusi ini sendiri juga. Anda harus menambahkan baris untuk memuat mod_rewrite dan "RewriteEngine On" dengan catatan bahwa itu mungkin tidak diperlukan. Itu untuk saya. :)
Harvey
2
Juga, karena kita hanya mengatakan Hilang atau Terlarang dan yang lebih penting, "-" mencegah substitusi, regex bisa menjadi lebih sederhana:RewriteRule . - [F]
Harvey
17

Berikut ini cara alternatif yang tidak melibatkan aturan penulisan ulang:

<VirtualHost _default_:*>
    <Location />
        Deny from all
        Options None
        ErrorDocument 403 Forbidden.
    </Location>
</VirtualHost>
atomsmith
sumber
2
Ini harus menjadi solusi yang diterima. +1
Greg Schmit
Saya tidak jelas tentang solusi ini. Saya memiliki beberapa file VHOST dan apakah saya hanya membuat yang baru dengan ini? Saya mencobanya, dan saya beri nama file 001.default.conf tetapi saya masih mengarahkan ulang subdomain saya.
Frantumn
@Fumnumn Seperti disebutkan dalam pertanyaan, "setiap permintaan http dengan Host yang tidak dikenal akan diarahkan ke VirtualHost pertama yang dimuat ". "Default" ini <VirtualHost>karena itu harus didefinisikan terlebih dahulu di konfigurasi server. Tepatnya file mana yang harus di dalam tergantung pada konfigurasi Anda. (Namun, masalah "subdomain yang dialihkan" Anda bisa menjadi masalah yang tidak terkait.)
MrWhite
Hah. Saat menggunakan domain lain yang mengarah ke server saya, itu tidak melakukan 403, itu hanya mengambil virtualhost pertama yang ditemukannya, meskipun servername bukan kecocokan
jjxtra
1

ini bekerja untuk saya

<VirtualHost x.x.x.x:80 [x:x::x:x:x:x]:80>
  ServerName myactualservername.com
  ServerAlias *
  <Location />
    Deny from all
    Options None
    ErrorDocument 403 Forbidden.
  </Location>
</VirtualHost>

ganti xxxx dengan ipv4 Anda yang sebenarnya dan ipv6
ganti myactualservername.com dengan situs web aktual yang dilayani oleh mesin

Saya menggunakan host virtual berbasis nama.
kredit untuk solusi ini ke
https://serverfault.com/a/82309/459796

Yashesh Bhatia
sumber