Имя сервера VirtualHost не работает (показывает /var/www), все псевдонимы работают

Я установил Apache 2 и создал и включил виртуальный хост.

Виртуальный хост имеет: ServerName example.com ServerAlias ​​*.example.com ServerAlias ​​foo.com ServerAlias ​​*.foo.com ServerAlias ​​bar.com ServerAlias ​​*.bar.com

Если я перенаправлю браузер на www.example.com, test.example.com, foo.com, www.foo.com и т. Д., НИЧЕГО, кроме простого имени сервера, он будет работать, как и ожидалось, с отображением содержимого /srv/www/example.com/public_html/index.php, который является DocumentRoot для виртуального хоста.

Тем не менее, если я пишу только " example.com " в браузере, я вижу содержимое /var/www/index.html

Это НЕ кешируется в браузере, я уже очистил кеш, а также попробовал другой браузер и пробовал через прокси.

Это не имеет смысла для меня. Любая идея?

Вот содержимое /etc/apache2/sites-enabled/000-default

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

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

А вот содержимое /etc/apache2/sites-enabled/example.com:

    <VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com
    ServerAlias foo.com
    ServerAlias *.foo.com
    ServerAlias bar.com
    ServerAlias *.bar.com
    #... and a few others
    DocumentRoot /srv/www/example.com/public_html
    ErrorLog /srv/www/example.com/error.log
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel notice
    CustomLog /srv/www/example.com/access.log combined

      <Directory /srv/www/example.com/public_html>
        Options FollowSymLinks
        AllowOverride All
      </Directory>

    </VirtualHost>

Я не могу понять, почему при использовании простого имени сервера имя vhost по умолчанию превалирует над тем, которое конкретно соответствует имени сервера, в то время как все псевдонимы работают нормально.

И вот вывод # apache2ctl -S

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443                  is a NameVirtualHost
     default server example.com (/etc/apache2/sites-enabled/default-ssl:2)
     port 443 namevhost example.com (/etc/apache2/sites-enabled/default-ssl:2)
*:80                   is a NameVirtualHost
     default server example.com (/etc/apache2/sites-enabled/000-default:1)
     port 80 namevhost example.com (/etc/apache2/sites-enabled/000-default:1)
     port 80 namevhost example.com (/etc/apache2/sites-enabled/example.com:1)
Syntax OK

(Я думаю, что нет необходимости говорить, что я заменил фактические доменные имена на "example.com", "foo.com" и "bar.com" только для публикации здесь в SF)

2 ответа

Решение

По-видимому, документация не ясно об этом.

С https://issues.apache.org/bugzilla/show_bug.cgi?id=57384

"Если вы опустите ServerName [в определении виртуального хоста], оно будет рассчитано на основе имени хоста системы (двойной обратный поиск DNS имени хоста системы)". Следовательно, если у включенного сайта 000-default нет имени сервера, это точно так же, как если бы он имел example.com в качестве ServerName, являясь example.com именем хоста моего сервера.

Следовательно, в моем случае, когда клиент запрашивает домен example.com, 000-default является первым сервером, который соответствует запрошенному имени хоста, и "ловит" запрос.

Если я хочу (как и я), чтобы сайт по умолчанию перехватывал все запросы, которые не совпадают ни с одним именем сервера, мне нужно указать фиктивное имя сервера в определении VirtualHost по умолчанию. Таким образом, запросы к имени хоста сервера не будут соответствовать виртуальному хосту по умолчанию, но они будут соответствовать виртуальному хосту example.com. А запросы, которые не совпадают ни с одним именем сервера или псевдонимом, будут перехвачены сайтом по умолчанию, потому что он первый.

"Первый из перечисленных vhost захватывает все, что не соответствует имени сервера / имя сервера, даже если вы укажете имя сервера".

Какие другие файлы связаны в /etc/apache2/sites-enabled/?

Часто для диагностики полезно включить информацию о моде, например так (с http://httpd.apache.org/docs/2.2/mod/mod_info.html):

<Location /server-info>
  SetHandler server-info
</Location>

<Location /server-info>
  SetHandler server-info
  Order deny,allow
  Deny from all
  Allow from yourcompany.com
</Location> 

Обычно я защищаю это сертификатом, но это выходит за рамки этого объяснения. Как только вы включите это и ограничитесь 127.0.0.1 (туннель с ssh к серверу, установите файл hosts и т. Д.). Вы можете увидеть точную рабочую конфигурацию, проанализированную Apache. Вы, вероятно, увидите, что на example.com ссылаются в других местах. Часто вещи имеют больше смысла, когда вы смотрите с помощью mod-info.

Другие вопросы по тегам