Почему http://localhost перенаправляет на виртуальный хост по умолчанию после настройки виртуальных хостов в Apache? - PullRequest
6 голосов
/ 09 февраля 2009

Это, вероятно, простой вопрос, но я хочу лучше понять, как Apache работает с виртуальными хостами. Я настраиваю виртуальные хосты, потому что я работаю на нескольких сайтах одновременно и не хочу использовать подкаталоги. Я в значительной степени использовал файл Apache httpd.conf по умолчанию, а DocumentRoot указывал на что-то вроде «/ www». Я раскомментировал, включают в себя виртуальные хосты и добавил следующее:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName site1.dev
    DocumentRoot /www/site1
</VirtualHost>

<VirtualHost *:80>
    ServerName site2.dev
    DocumentRoot /www/site2
</VirtualHost>

Теперь, когда я перехожу на http://localhost, я получаю страницу по умолчанию для site1.

Я уверен, что есть причина, почему это имеет смысл, но я не совсем понимаю. Я бы подумал, что через эту директиву будут перенаправляться только те запросы, которые явно относятся к http://site1.test, и он не станет просто по умолчанию. Может кто-нибудь объяснить, почему он становится по умолчанию.

Ответы [ 4 ]

11 голосов
/ 09 февраля 2009

http://httpd.apache.org/docs/1.3/vhosts/name-based.html

(должно быть верно и для 2.x)

"Если соответствующий виртуальный хост не найден, будет использоваться первый из перечисленных виртуальных хостов, который соответствует IP-адресу.

Как следствие, первый виртуальный хост в списке является виртуальным хостом по умолчанию. DocumentRoot с основного сервера никогда не будет использоваться, когда IP-адрес соответствует директиве NameVirtualHost. Если вы хотите иметь специальную конфигурацию для запросов, которые не соответствуют ни одному конкретному виртуальному хосту, просто поместите эту конфигурацию в контейнер и сначала укажите ее в файле конфигурации. "

4 голосов
/ 09 февраля 2009

ответ 1 правильный и я бы добавил с namevirtualhosts в качестве первой записи по существу соответствует любому неименованному в другом месте virtualhost

он должен использоваться ТОЛЬКО для улавливания непреднамеренно искаженного и прерванного трафика

т. Е. У machene с одним ip под названием john.domain.com, на котором запущены www.domain.com и www.domain2.com в качестве допустимых веб-серверов на ip www.xxx.yyy.zzz, может быть оптимальная конфигурация, например,

    <VirtualHost *:80>
     DocumentRoot /var/webserver/static-sites/unknown/
    # a directory readable by apache with only a robots.txt denying everything
     ServerName bogus
     ErrorDocument 404 "/errordocuments/unknown-name.html"
    #custom 404 describing how/what they might have done wrong try pointing a browser {with a hosts file at http://bogus/ on 193.120.238.109 to see mine#
     ErrorLog /var/log/httpd/unknown-error.log
     CustomLog /var/log/httpd/unknown-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     DocumentRoot /var/webserver/static-sites/unknown/
    # a possibly different directory readable by apache with only a robots.txt denying everything
     ServerName www.xxx.yyy.zzz
     ServerAlias john.domain.com
     ErrorDocument 404 "/errordocuments/ip-name.html"
     ErrorDocument 403 "/errordocuments/ip-name.html"
    #custom 404 telling them as a likely hacker/bot you wish to have nothing to do with them see mine at http://193.120.238.109/
     ErrorLog /var/log/httpd/ip-error.log
     CustomLog /var/log/httpd/ip-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     ServerName domain.com
     RedirectPermanent / http://www.domain.com/
     ErrorLog logs/www.domain.com-error.log
     CustomLog logs/www.domain.com-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     DocumentRoot /var/webserver/ftpusers/domain
     ServerName www.domain.com
     ServerPath /domain
     ErrorLog logs/www.domain.com-error.log
     CustomLog logs/www.domain.com-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     ServerName domain2.com
     RedirectPermanent / http://www.domain2.com/
     ErrorLog logs/www.domain2.com-error.log
     CustomLog logs/www.domain2.com-access.log combined
    </VirtualHost>

    <VirtualHost *:80>
     DocumentRoot /var/webserver/ftpusers/domain2
     ServerName www.domain2.com
     ServerPath /domain2
     ErrorLog logs/www.domain2.com-error.log
     CustomLog logs/www.domain2.com-access.log combined
    </VirtualHost>
3 голосов
/ 08 ноября 2013

Подтверждение того, что для Apache 2.x будет использоваться первый виртуальный хост (с тем же номером порта), если соответствующий виртуальный хост не найден.

http://httpd.apache.org/docs/2.2/vhosts/details.html

"Если не найдено подходящего хоста, запрос подается от первого хоста с соответствующим номером порта в списке для IP-адреса, к которому подключен клиент" *

Вы всегда можете добавить этот код ниже, поместите его прямо под NameVirtualHost *:80, чтобы корневой каталог документа по умолчанию обслуживался по умолчанию, если другие виртуальные хосты не найдены.

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot /my/default/document/root
</VirtualHost>
0 голосов
/ 19 декабря 2012

Один из способов сделать это:

  1. В вашей конфигурации VirtualHosts введите конкретное имя локального сайта, который вы хотите включить вместо использования подстановочного знака: <VirtualHost site1.dev:80> вместо <VirtualHost *:80>

  2. Отключите NameVirtualHost *:80, что можно сделать, закомментировав его в файле vhosts.conf

  3. В вашем файле / etc / hosts укажите оба псевдонима для петлевого IP: 127.0.0.1 localhost site1.dev

Вот и все. Вы должны увидеть, что localhost переходит к стандартному DocumentRoot по умолчанию, а site1.dev - к сайту, который вы настроили как виртуальный хост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...