Чому Apache може ігнорувати віртуальний хост із ім'ям сервера, що відповідає запитуваній URL-адресі?


26

Я намагаюся додати другий віртуальний хост до моєї конфігурації apache, але не можу отримати новий віртуальний хост для використання.

Мій httpd.confпросто містить такий рядок:

ServerName radiofreebrighton.org.uk

У мене також є ports.confфайл, який містить наступне:

NameVirtualHost *:80
Listen 80

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

У мене є два файли , в sites-availableяких слінковани в sites-enabledпо a2ensite:

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

Зміст першого:

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

Зміст останнього:

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

Але щоразу, коли я запитую сторінку з trafalgararches.co.uk, мені видають сторінку з radiofreebrighton.org.uk. Чому це може статися? Як я можу це виправити?


Редагувати:

Конфігурація віртуального хоста, як це розуміє 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

(Зібраний через apache2ctl -Sака httpd -S.)


1
Не впевнені, що це є причиною, але вам слід зняти косої риски з кінців вашої лінії ServerNameта ServerAliasрядків. Також переконайтеся, що ви перезапустили апаш.
EEAA

Я майже впевнений, що це причина. Це означає, що ім'я хоста в запиті ніколи не буде відповідати імені сервера для цього віртуального хоста.
larsks

1
@ErikA, @larsks - Ви, хлопці, отримали мої сподівання! Я зняв останню косу рису і перезапустив apache, але це нічого не змінило.
Том Райт

1
У вас є NameVirtualHost *:80десь у вашій конфігурації?
larsks

1
Я не впевнений, що сайти, згадані вище, є виробництвом чи розробкою, але насправді перехід на ці URL-адреси дає мені дві різні сторінки (правильні сторінки за зовнішнім виглядом). Якщо вищевикладені призиви на сервері розробки, ігноруйте цей коментар. В іншому випадку, можливо, ви вирішили свою проблему десь по дорозі і все ще зберігаєте кешовану копію.
cyberx86

Відповіді:


15

Ну, це питання вже понад рік, але я натрапив на подібну "проблему". Це може бути очевидним, але не забудьте перезапустити службу apache після включення додаткового віртуального хоста. Дивіться, після виконання a2ensiteдругого віртуального хоста, результат виводу apache2ctl -Sпокаже, що обидва сайти доступні (і один з них за замовчуванням), навіть якщо ви не перезавантажили апаш.

Скажімо, у вас є два віртуальних хости - site1 та site2. Ви запускаєте a2ensite site1та перезавантажуєте службу apache. Тепер ви можете отримати доступ, http://site1і це за замовчуванням. Тепер ви запустите a2ensite site2, але забудьте перезапустити apache. Вихід apache2ctl -Sбуде:

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

Але коли ви намагаєтеся завантажити http://site2, він фактично завантажить сайт за замовчуванням (site1), оскільки конфігурація не завантажена.


Я отримую той же вихід, але навіть тоді він не завантажує другий веб-сайт.
arqam

15

У мене була подібна проблема, коли всі мої додаткові vhosts на порт 443 (SSL / HTTPS) були спрямовані до каталогу першого перерахованого vhost. Apache фактично ігнорував властивість імені сервера та збігався лише на ip: порт.

Виявляється, я пропустив команду 'NameVirtualHost *: 443', щоб увімкнути віртуальний хостинг для порту 443.

'NameVirtualHost *: 443' просто потрібно викликати один раз, і його потрібно визначити над вашими vhosts для порту 443. Я вкладаю своє визначення у файл ports.config, щоб воно виглядало так:

NameVirtualHost *:80
Listen 80

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

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

Не забудьте перезапустити апаш після будь-яких змін.


1
Для чого це варто ... в Apache 2.4.18, використовуючи NameVirtualHostвидає це повідомлення при запуску:AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf
Lambart

4

Мої 2 центи: оскільки я маю дотримуватися IP-адреси (я не хочу, щоб сайт обслуговувався у всіх встановлених мережах), сталося, що після локального приватного IP-сервера змінився, я забув змінити його тут:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

Звичайно, це не проблема Apache, щоб повідомити, що IP не існує локально.


2

Томе, дивіться тут http://httpd.apache.org/docs/2.0/en/mod/core.html#namevirtualhost

Примітка

Зауважте, що "основний сервер" та будь-які сервери за замовчуванням ніколи не будуть подаватися для запиту на IP-адресу NameVirtualHost (якщо ви чомусь не вказали NameVirtualHost, але потім не визначите жодної VirtualHosts для цієї адреси).

Тож буде добре, якщо ви зміните за замовчуванням ip-адресу вашого сервера.


Я спробував це, але це нічого не змінило. Я також хотів би уникати прив'язки себе до певного IP, тому я збираюся його змінити. Також я повинен зазначити, що vhost за замовчуванням - це той, що працює.
Том Райт

1

Відповідь я знаходжу звідси: http://alexking.org/blog/2007/11/01/apache-2-only-serve-first-virtual-host

Помістіть 2 імені сервера в той самий 1 тег VirtualHost, як показано нижче:

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

У мене виникли проблеми з другим сайтом, оскільки у мене було два блоки тегів VirtualHost.


0

У мене виникла проблема з переміщенням сайтів на новий сервер Ubuntu 16. Після невеликого потріскування головою я зрозумів, що модуль SSL не був включений за замовчуванням, тому все, що знаходиться всередині <IfModule mod_ssl.c>блоків, звичайно, мовчки ігнорується.

Роки тому я завернув усі свої SSL-файли в цьому умовному, і цього разу я просто скопіював конфігураційні файли на новий сервер.

Я виправив це, включивши модуль:

sudo a2enmod ssl

0

Я виявив, що джерелом цієї проблеми був запис / etc / hosts на моєму сервері, URL-адреса в ньому вказує на зовнішній IP-адресу сервера.

Одного разу я повинен був налаштувати його до того, як DNS був готовий, щоб я ввів запис / etc / hosts на своєму сервері, вказуючи на його власний зовнішній IP:

1.2.3.4 vhost.example.com

Тоді я налаштував ServerAlias ​​на існуючий сайт для "vhost.example.com"

Але нічого, що я міг би зробити, не зупинило б Apache розміщувати сайт за замовчуванням ssl.conf для SSL-запитів на vhost.example.com. Порт 80 HTTP працював нормально, але SSL завжди показував сайт за замовчуванням. Врешті-решт ця нитка SO змусила мене спробувати "apachectl -S", який показує сайти, і, нарешті, я зміг це зрозуміти.

Тож якщо ви отримуєте веб-сайт за замовчуванням замість сайту, який ви очікуєте, переконайтеся, що ви не додали зовнішню IP-адресу вашого сервера у запис / etc / hosts! Дуже дивна річ, яку можна було зробити заднім числом, але, сподіваємось, це допомагає комусь іншому!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.