Penanganan default untuk domain / subdomain yang tidak cocok di Apache

12

Saya memiliki konfigurasi Apache2 dengan beberapa VirtualHosts. DNS saya diset untuk menerima *.<domain>.<tld>di banyak domain. Semuanya berfungsi dengan benar tetapi jika saya pergi ke something-random-here.example.comsaya tampaknya mendapatkan VirtualHost yang tidak valid dipilih (Saya menduga yang pertama atau terakhir ditemukan). Apakah ada cara untuk memberitahu Apache untuk menggunakan aturan tertentu jika tidak ada entri VirtualHost yang cocok dengan domain atau subdomain? Saya lebih suka mengembalikan 404.

Ryall
sumber

Jawaban:

12

Apache menggunakan virtualhost pertama jika tidak ada nama yang cocok. Cukup konfigurasikan virtualhost baru sebagai yang pertama dengan nama acak, tampilkan apa pun yang Anda suka - atau kembalikan halaman 404.

Moritz Keduanya
sumber
Terima kasih tetapi bisakah Anda menjelaskannya? Saya tidak bisa melakukan ini.
Ryall
2
Bagaimana file konfigurasi apache2 Anda diletakkan? Atau sistem operasi apa yang Anda gunakan? Apache membaca konfigurasi dalam urutan tertentu, dan VirtualHost pertama yang dilihatnya adalah yang default. Ia menerima semua lalu lintas dari nama host yang tidak dikenal. Jadi jika Anda memiliki file konfigurasi tunggal, VirtualHost pertama adalah itu. Jika Anda memiliki lebih dari satu, seperti pada sebagian besar linux, mungkin itu yang disebut 0default atau lebih ...
Moritz Both
Saya menaruh beberapa konfigurasi default di ports.conf. Itu tidak berfungsi karena saya mencoba mencocokkan *: 80 ketika saya menggunakan <ip>: 80 di virtualhosts saya. Sebaliknya saya harus membuat entri default terpisah untuk setiap IP dan berfungsi sekarang.
Ryall
File v-host pertama atau terakhir saya tidak digunakan. Saya pikir apache telah berubah.
Cobolt
4

Wildcard menyertakan file konfigurasi situs Anda:

Include path/to/site/confs/*httpd.conf

Atur file conf situs Anda sehingga mereka dimuat dalam urutan yang diharapkan. Contoh...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

dll ...

Apache akan membaca ini secara berurutan. Kemudian buat satu yang akan selalu memuat terakhir untuk menangkap semua host virtual yang tak tertandingi dan mengembalikan 404 alih-alih memuat situs default.

99-catchall-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Pastikan untuk mengganti port dengan port apa pun yang didengarkan httpd Anda. Atau jika Anda mendengarkan httpd di antarmuka tertentu, Anda harus menambahkan catchall untuk setiap antarmuka, seperti:

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

Semoga ini membantu. Saya menggunakan metode ini untuk memuat situs dalam urutan yang saya tentukan dan mencegah host virtual yang tak tertandingi dari memuat situs yang tidak terduga secara tidak sengaja.

Jason Slobotski
sumber
bukankah "ServerAlias ​​*" harus dihapus dari aturan catch-all?
Ahm3d Mengatakan
Saya kira itu tidak masalah. Jika tidak ada host virtual sebelum catchall menangani permintaan, ini akan mengembalikan respons 404. Saya tidak melihat alasan bahwa ServerAlias ​​* harus dihapus, tetapi mereka mungkin tidak perlu spesifik.
Jason Slobotski
0

Seperti Moritz Bothdisebutkan, Apache2 akan menggunakan host virtual pertama yang ditemukannya jika tidak cocok dengan yang Anda minta.

Ketika Anda pertama kali menginstal Apache2 ada conf situs web default yang dapat Anda gunakan sebagai templat, modifikasi atau hapus, dan saya selalu bertanya-tanya untuk apa sebenarnya 000-default.conf, karena mereka juga memiliki default.conf. Setelah membaca apa yang Moritz Bothdikatakan, semuanya lebih masuk akal sekarang.

Apa yang saya lakukan untuk server saya adalah menyalin konfigurasi untuk nama host default (situs web) ke file 000-default.conf dan a2ensite 000-default.

Sekarang, setiap kali ada permintaan domain yang tak tertandingi ke situs web saya, itu melayani halaman 000-default, yang hanya merupakan salinan dari halaman default saya yang sebenarnya.

Pengembang Newteq
sumber
1
Saya melakukan hal yang sama tetapi host saya yang tidak cocok / default mengirimkan redirect ke situs tingkat atas yang tepat yang mengubah URL yang ditampilkan ke yang benar juga.
ivanivan
Itu ide yang sangat bagus! Saya tidak memikirkan hal itu. Saya pasti akan mengimplementasikan situs saya seperti itu :)
Pengembang Newteq
Untuk beberapa alasan, sepertinya saya tidak dapat mengalihkan ssl (halaman default) saya. Saya punya <VirtualHost *:443> ... Redirect / https://baseurl/ ... </VirtualHost> tetapi url tetap sama. Saya telah melakukan hal yang sama untuk versi non ssl dan itu dialihkan dengan benar. Ada ide?
Pengembang Newteq