Mengapa Apache mungkin mengabaikan host virtual dengan ServerName yang cocok dengan URL yang diminta?


26

Saya mencoba menambahkan host virtual kedua ke konfigurasi apache saya, tetapi sepertinya tidak bisa mendapatkan host virtual baru untuk digunakan.

Saya httpd.confhanya berisi baris berikut:

ServerName radiofreebrighton.org.uk

Saya juga punya ports.conffile, yang berisi yang berikut ini:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

Saya memiliki dua file sites-availableyang disinkronkan sites-enabledoleh a2ensite:

  • radiofreebrighton.org.uk
  • trafalgararches.co.uk

Isi yang pertama adalah:

<VirtualHost _default_:80>
    DocumentRoot /home/tom/www

    ServerAdmin tom@radiofreebrighton.org.uk
    ServerName radiofreebrighton.org.uk
    ServerAlias www.radiofreebrighton.org.uk

    <Directory /home/tom/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log
    LogLevel error
    CustomLog /var/log/apache2/access.log combined

    Alias /wiki /home/tom/www/mediawiki/index.php
</VirtualHost>

Isi yang terakhir adalah:

<VirtualHost *:80>
    DocumentRoot /home/tom/tata-www

    ServerAdmin admin@trafalgararches.co.uk
    ServerName trafalgararches.co.uk
    ServerAlias www.trafalgararches.co.uk

    <Directory /home/tom/tata-www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    logLevel error
    ErrorLog /var/log/apache2/error.log
</VirtualHost>

Tetapi setiap kali saya meminta halaman dari trafalgararches.co.uk, saya diberi halaman dari radiofreebrighton.org.uk. Mengapa ini bisa terjadi? Bagaimana saya bisa memperbaikinya?


Edit:

Konfigurasi host virtual sebagaimana dipahami oleh apache:

tom@rfb:/usr/local$ apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost trafalgararches.co.uk (/etc/apache2/sites-enabled/trafalgararches.co.uk:1)
Syntax OK

(Diperoleh melalui apache2ctl -Salias httpd -S.)


1
Tidak yakin inilah penyebabnya, tetapi Anda harus menghapus garis miring dari ujung garis ServerNamedan Anda ServerAlias. Juga, pastikan Anda telah memulai kembali apache.
EEAA

Saya hampir yakin itu penyebabnya. Itu berarti nama host dalam permintaan tidak akan pernah cocok dengan ServerName untuk host virtual itu.
larsks

1
@ErikA, @larsks - Kalian punya harapanku! Saya menghapus garis miring dan memulai kembali apache, tetapi itu tidak mengubah apa pun.
Tom Wright

1
Apakah Anda memiliki NameVirtualHost *:80tempat dalam konfigurasi Anda?
larsks

1
Saya tidak yakin apakah situs-situs yang disebutkan di atas adalah produksi atau pengembangan, tetapi sebenarnya pergi ke URL-URL itu memang memberikan dua halaman berbeda untuk saya (halaman yang benar menurut tampilannya). Jika vhosts di atas ada di server pengembangan, abaikan komentar ini. Jika tidak, Anda mungkin telah memperbaiki masalah Anda di suatu tempat di sepanjang jalan dan masih memiliki salinan dalam cache yang ada.
cyberx86

Jawaban:


15

Nah, pertanyaan ini sudah berusia lebih dari satu tahun, tetapi saya telah menemukan "masalah" serupa. Ini mungkin jelas, tetapi jangan lupa untuk me-restart layanan apache setelah mengaktifkan virtual host tambahan. Lihat, setelah mengeksekusi a2ensiteuntuk virtual host kedua, output dari apache2ctl -Sakan menunjukkan bahwa kedua situs tersedia (dan salah satunya adalah default), bahkan jika Anda tidak memuat ulang apache.

Katakanlah Anda memiliki dua host virtual - site1 dan site2. Anda menjalankan a2ensite site1dan kemudian memuat kembali layanan apache. Sekarang Anda dapat mengakses http://site1dan itu adalah default. Sekarang Anda jalankan a2ensite site2, tetapi lupa untuk me-restart apache. Output dari apache2ctl -Sakan:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site2 (/etc/apache2/sites-enabled/site2:1)
Syntax OK

Tetapi ketika Anda mencoba memuat http://site2, itu sebenarnya akan memuat situs default (site1), karena konfigurasi tidak dimuat.


Saya mendapatkan hasil yang sama tetapi meskipun itu tidak memuat situs web kedua.
arqam

15

Saya memiliki masalah serupa di mana vhosts tambahan saya pada port 443 (SSL / HTTPS) semuanya diarahkan ke direktori vhost pertama yang terdaftar. Apache pada dasarnya mengabaikan properti servername dan hanya cocok di ip: port.

Ternyata saya kehilangan perintah 'NameVirtualHost *: 443' untuk mengaktifkan hosting virtual Bernama untuk port 443.

'NameVirtualHost *: 443' hanya perlu dipanggil sekali, dan harus didefinisikan di atas vhosts Anda untuk port 443. Saya meletakkan definisi saya di file ports.config sehingga terlihat seperti:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

Jangan lupa untuk me-restart apache setelah perubahan.


1
Untuk apa nilainya ... di Apache 2.4.18, menggunakan NameVirtualHostmenghasilkan pesan ini pada saat startup:AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf
Lambart

4

2 sen saya: karena saya harus tetap menggunakan IP (saya tidak ingin situs dilayani pada semua jaringan yang diinstal), kebetulan setelah IP pribadi lokal dari server berubah, saya lupa mengubahnya di sini:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

Tentu saja ini bukan masalah Apache untuk memberi tahu Anda bahwa IP tidak ada secara lokal.


2

Tom, silakan lihat di sini http://httpd.apache.org/docs/2.0/id/mod/core.html#namevirtualhost

Catatan

Catatan, bahwa "server utama" dan setiap standar server akan tidak pernah akan disajikan untuk permintaan ke alamat NameVirtualHost IP (kecuali untuk beberapa alasan Anda tentukan NameVirtualHost tapi kemudian tidak mendefinisikan VirtualHosts untuk alamat itu).

Jadi seharusnya tidak apa-apa jika Anda mengubah default ke ip-address server Anda.


Saya mencobanya, tetapi tidak mengubah apa pun. Saya juga ingin menghindari mengikatkan diri pada IP tertentu, jadi saya akan mengubahnya kembali. Juga, saya harus menunjukkan bahwa vhost default adalah yang berfungsi.
Tom Wright

1

Saya menemukan jawaban dari sini: http://alexking.org/blog/2007/11/01/apache-2-only-serves-first-virtual-host

Masukkan 2 servername dalam tag VirtualHost 1 yang sama seperti di bawah ini:

<VirtualHost *:80>
ServerName beta-site-1.com
DocumentRoot "/Library/WebServer/beta-site-1"

ServerName beta-site-2.com
DocumentRoot "/Library/WebServer/beta-site-2"
</VirtualHost>

Saya akhirnya mengalami masalah dengan situs kedua karena saya memiliki dua blok tag VirtualHost.


0

Saya mengalami masalah ini saat memigrasi situs ke server Ubuntu 16 yang baru. Setelah sedikit menggaruk-garuk kepala, saya menyadari Modul SSL tidak diaktifkan secara default, jadi apa pun di dalam <IfModule mod_ssl.c>blok tentu saja diabaikan dengan diam-diam.

Bertahun-tahun yang lalu saya membungkus semua vhost SSL saya dalam kondisi ini, dan kali ini saya baru saja menyalin file konfigurasi ke server baru.

Saya memperbaikinya dengan mengaktifkan modul:

sudo a2enmod ssl

0

Saya menemukan sumber masalah ini adalah entri / etc / hosts di server saya dengan URL di dalamnya menunjuk ke IP eksternal server.

Pada satu titik, saya harus menyiapkannya sebelum DNS siap, jadi saya memasukkan entri / etc / hosts di server saya yang menunjuk ke IP eksternal sendiri:

1.2.3.4 vhost.example.com

Lalu saya mengatur ServerAlias ​​ke situs yang ada untuk "vhost.example.com"

Tapi tidak ada yang bisa saya lakukan untuk menghentikan Apache yang melayani situs default-ssl.conf untuk permintaan SSL ke vhost.example.com. HTTP Port 80 bekerja dengan baik, tetapi SSL selalu menampilkan situs default sebagai gantinya. Pada akhirnya utas ini mengarahkan saya untuk mencoba "apachectl -S" yang menunjukkan situs dan akhirnya saya bisa mengetahuinya.

Jadi jika Anda mendapatkan situs SSL default alih-alih situs yang Anda harapkan, pastikan Anda tidak menambahkan alamat IP eksternal server Anda di entri / etc / hosts! Suatu hal yang cukup aneh untuk dilakukan di belakang, tetapi mudah-mudahan ini membantu orang lain!

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.