Apache Default / Catch-All Virtual Host?


67

Jika saya memiliki 3 domain, domain1.com, domain2.com, dan domain3.com, apakah mungkin membuat host virtual default ke domain yang tidak terdaftar? Misalnya, jika saya ingin:

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>

Jika Anda mendaftarkan domain dan mengarahkannya ke server saya, itu akan default ke semuanya lain yang menunjukkan sama dengan domain3. Apakah itu mungkin?

Jawaban:


45

Ya, itu akan berfungsi, kecuali ServerAlias ​​harus "*", dengan ServerName diatur ke nama host yang sebenarnya. Anda mungkin perlu memastikan bahwa VirtualHost adalah yang terakhir dimuat ...


Seharusnya berhasil, tetapi tidak. Jika domain tidak terdaftar secara spesifik, saya mendapatkan "Firefox tidak dapat menemukan server."
SJaguar13

2
Apakah Anda menetapkannya sebagai "Host ServerName" dan "ServerAlias ​​*"? Saya tidak terlalu menekankan ini pada awalnya, tetapi ServerName tidak mengambil wildcard, hanya ServerAlias ​​yang melakukannya. ServerName harus merupakan nama host yang sebenarnya.
freiheit

Juga, apakah virtualhosts lain berfungsi? Apa versi apache?
freiheit

"Firefox tidak dapat menemukan server." bukan masalah apache. Anda perlu lebih detail (server apa jika ada yang dihubungi, apa kode kesalahannya ...)
Law29

Aneh yang tidak bekerja untuk saya, selalu memilih virtualhost pertama terlepas dari header host
jjxtra

80

Saat menggunakan host virtual berbasis nama, konfigurasi host virtual pertama yang dimuat akan menjadi default (Sumber: Apache Wiki ). Misalnya, dengan konfigurasi di bawah ini, domain yang tidak cocok akan cocok dengan domain-one.com:

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName domain-one.com
  # Other options and directives ..
</VirtualHost>

<VirtualHost *:80>
  ServerName domain-two.com
  # Other options and directives ..
</VirtualHost>

Banyak server tidak memiliki file konfigurasi monolitik, tetapi memiliki beberapa file konfigurasi khusus host yang diatur sebagai berikut:

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

Dalam hal ini, untuk membuat beban konfigurasi host virtual tertentu terlebih dahulu, ganti nama symlink ke sesuatu yang akan menjadi yang pertama saat diurutkan, seperti 00-default.


Beberapa jawaban lain tidak sepenuhnya benar. Menurut Wiki Apache, pengaturan ServerNamedi host virtual tidak benar. Jika host tanpa sebuah ServerNametidak dimuat terlebih dahulu, Apache mungkin bahkan tidak pernah menggunakannya, karena host pertama yang dimuat akan menjadi default.

Selain itu, walaupun ServerAlias *memang akan cocok dengan apa pun, itu juga dapat menimpa host virtual lain yang ditentukan kemudian. Mungkin pendekatan ini akan berhasil jika selalu menjadi host virtual terakhir yang didefinisikan (seperti dalam konfigurasi yang diberikan dalam pertanyaan), tetapi ini berarti menambahkan arahan baru dan mengubah urutan sortir alih-alih hanya mengubah urutan seperti di atas.


+1 juta internet untuk Anda, Tuan! Itu harus menjadi yang pertama menjadi default.
Ryan

Apakah Anda tahu yang mana yang lebih dulu, httpd.conf atau conf.d / xyz.conf?
Esa Varemo

2
"konfigurasi virtual host pertama yang dimuat akan menjadi default" menyelesaikan masalah saya dengan domain SSL lokal di XAMPP (Windows). Sepertinya Apache menggunakan vhost pertama sebagai default untuk setiap port, jadi untuk menangani dengan benar domain yang tidak cocok untuk kedua permintaan tanpa jaminan / aman, harus ada 2 konfigurasi "default" eksplisit untuk 80/443 port yang ditentukan pada awalhttpd-vhosts.conf
Wirone

1
@EsaVaremo - httpd.conf akan dimuat lebih dulu, dan ia akan memiliki baris Sertakan yang sumber conf.d / xyz.conf (atau kemungkinan, conf.d / *). konfigurasi apa pun (termasuk vhosts) sebelum baris Sertakan akan diproses terlebih dahulu; apa pun setelah baris sertakan diproses setelah file yang disertakan.
Dan Pritts

7

Jangan tentukan nama server, dan itu menjadi vhost default Anda ..

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

Pastikan juga Anda belum menentukan DocumentRoot di file httpd.conf utama, karena itu akan lebih diutamakan daripada vhosts.


Saya memilikinya sebagai host virtual pertama yang terdaftar, dan saya masih mendapatkan "Firefox tidak dapat menemukan server."
SJaguar13

2
Saya tidak setuju. Saya telah menetapkan host virtual pertama saya tanpa ServerName, namun, tampaknya bertentangan dengan beberapa host virtual, tetapi tidak yang lain. Saya memecahkan masalah dengan menambahkan ServerName, tetapi mengaturnya ke beberapa domain acak yang tidak ada di server saya. Karena ini adalah virtual host pertama, ini digunakan sebagai default, tetapi hanya cocok ketika domain tidak cocok dengan ServerName lainnya digunakan.
joshaidan

3

Urutan itu penting - pindahkan definisi vhost Anda untuk yang lainnya ke bagian atas daftar.


2

Gunakan host virtual _default_ dan letakkan dulu di httpd-vhosts.conf seperti yang ditentukan dalam http://httpd.apache.org/docs/2.2/vhosts/examples.html

"Menangkap setiap permintaan ke alamat IP dan port yang tidak ditentukan, yaitu, kombinasi alamat / port yang tidak digunakan untuk virtual host lain [...] Vhost default tidak pernah melayani permintaan yang dikirim ke alamat / port yang digunakan untuk vhost berbasis nama. Jika permintaan berisi header yang tidak diketahui atau tidak ada: header selalu dilayani dari vhost berbasis nama utama (vhost untuk alamat / port yang muncul pertama kali dalam file konfigurasi). "

Cuplikan dari httpd-vhosts.conf yang hidup tetapi dikaburkan yang terjadi untuk mengunci semua vhosts ke port 80:

# Listen for virtual host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80

<VirtualHost _default_:80>
# This vhost catches client requests with host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
    RewriteCond %{HTTP_HOST}    ^(.*)$
    RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
</VirtualHost>

# Name based vhosts here:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

Penjelasan mendalam tentang proses pencocokan vhost dapat ditemukan di sini: http://httpd.apache.org/docs/2.2/vhosts/details.html


2
_default_hanya digunakan untuk IP yang tidak cocok , jadi ketika Anda memiliki vhost wildcarded (*: 80) itu tidak akan pernah digunakan.
Wirone

2

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. Lalu 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 memuat situs yang tidak terduga secara tidak sengaja.


1

Solusi terbaik adalah mengubah nama file konfigurasi situs dimulai dengan "1" sehingga akan memuat pertama dan itu akan menjadi situs default Anda.

Apache2 menjadikan file vhost pertama yang dimuat sebagai halaman default.


instalasi apache default juga memiliki 000-defaulthost virtual untuk alasan ini.
vp_arth

0

saat menggunakan <VirtualHost *:port>dan menentukan ServerName / ServerAlias ​​untuk host yang Anda pedulikan, itulah yang perlu saya lakukan.

Sedikit latar belakang dalam situasi saya:

Saya memiliki alamat IP dinamis dari ISP saya sehingga alamat IP saya terdaftar di perusahaan yang mendaftar alamat IP dinamis (noip.org dalam kasus saya). Salah satu "host" saya harus didaftarkan pada pendaftaran DNS saya sebagai myabc.example.com sebagai CNAME yang menunjuk ke host1.ddns.net. Tetapi host2.ddns.net dibiarkan apa adanya. Saya ingin myabc.example.com dan host1.ddns.net untuk pergi ke site1 dan host2.ddns.net untuk pergi ke situs 2 dan apa pun termasuk alamat IP saya untuk pergi ke default.

Pertama file conf membaca akan menjadi default, yaitu 000_def.conf, 001_site1.conf, 002_site2.confakan dibaca agar dengan 000_def.confsebagai situs default. (catatan: dalam kasus saya, saya memiliki "file" ini di /etc/apache2/sites-enabledmana sebenarnya adalah tautan dinamis ke file conf aktual /etc/apache2/sites-available)

Karena ServerName sedang digunakan di 001_site1.conf dan 002_site2.conf, itu juga harus diatur ke sesuatu di 000_def.conf.

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName host2.ddns.net
</VirtualHost>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.