Назад | Перейти на главную страницу

Сайт не найден и страница не найдена с динамическим массовым виртуальным хостингом

Я недавно установил массовый виртуальный хостинг в Apache, поэтому все, что нам нужно сделать, это создать каталог для создания нового виртуального хоста. Затем мы также используем DNS с подстановочными знаками для сопоставления всех поддоменов с сервером, на котором запущен наш экземпляр Apache.

Это работает превосходно, однако теперь у меня возникают проблемы с настройкой его для переключения на соответствующую страницу по умолчанию / ошибку, когда каталог vhost не существует.

Проблема, по-видимому, связана с моим желанием обработать два состояния ошибки:

  1. vhost не найден, т.е. не найден каталог, соответствующий хосту, указанному в заголовке хоста HTTP. Я хочу, чтобы отображалась страница с ошибкой "Не найден соответствующий сайт".
  2. 404-я страница не найдена, состояние виртуального хоста.

Кроме того, у меня есть специализированный vhost "api" в собственном блоке vhost.

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

NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /var/www/site-not-found
    ServerName sitenotfound.mydomain.org

    ErrorDocument 500 /500.html
    ErrorDocument 404 /500.html
</VirtualHost>

<VirtualHost *:80>
    ServerName api.mydomain.org
    DocumentRoot /var/www/vhosts/api.mydomain.org/current
    # other directives, e.g. setting up passenger/rails etc...
</VirtualHost>

<VirtualHost *:80>
    # get the server name from the Host: header
    UseCanonicalName Off
    VirtualDocumentRoot /var/www/vhosts/%0/current
    # other directives ... e.g proxy passing to api etc...
    ErrorDocument 404 /404.html
</VirtualHost>

Насколько я понимаю, первый блок vhost используется по умолчанию, поэтому у меня он здесь как мой сайт для всех. Затем у меня есть мой API vhost, а затем, наконец, мой массовый блок vhost.

Итак, для домена, который не соответствует первым двум ServerName и не имеет соответствующего каталога в /var/www/vhosts/ Я ожидал, что он переключится на первый виртуальный хост, однако с этой настройкой все домены разрешаются на мой сайт по умолчанию, который не найден. Почему это?

Поместив блок mass-vhost первым, я могу заставить массовые vhosts разрешиться должным образом, но не мой виртуальный хост site-not-found ... и в этом случае я не могу найти способ различать страницы -level 404 в vhost, а также случай, когда VirtualDocumentRoot не может найти каталог vhost (похоже, также используется 404).

Любая помощь из этой привязки очень ценится!

Я ожидал, что он переключится на первый виртуальный хост, однако с этой настройкой все домены разрешаются на мой сайт по умолчанию, который не найден. Почему это?

Нет никакой логики переключения между разными виртуальными хостами - как только запрос назначен одному, он является окончательным.

Когда у тебя нет ServerName или ServerAlias в вашем динамическом блоке виртуального хоста вы зависите от поведения «первый загружаемый виртуальный хост по умолчанию» для назначения запросов этому виртуальному хосту. Когда это не первый загружаемый виртуальный хост, он по сути инертен; у него нет возможности получить запрос.


Моя рекомендация относительно того, как с этим справиться, состоит в том, чтобы поведение «сайт не найден» было либо прокси-сервером, либо перенаправлением на рабочий сайт (который затем обслуживает страницу «здесь нет контента!») Вместо варианта вашего 404 страница.

Переместите sitenotfound.mydomain.org vhost вниз и верните динамический наверх, чтобы он был по умолчанию. Мы будем использовать его для обслуживания нашей дружелюбной страницы «Нет сайта здесь».

Затем давайте дадим динамическому виртуальному хосту возможность проверять, существует ли сайт, прежде чем предоставлять с него контент. Добавьте в его vhost:

RewriteEngine On
# If there's no directory where it should be for this host..
RewriteCond /var/www/vhosts/%{HTTP_HOST} !-d
# (or a symlink, we'll be ok with those too)
RewriteCond /var/www/vhosts/%{HTTP_HOST} !-l

# Then, we'll redirect the user to our friendly "no site here" page..
# Note that I'm setting it to 302 so that they won't be cached, since
# you might trigger this accidentally just before a new site goes live..
RewriteRule ^ http://sitenotfound.mydomain.org/invalid-site.html [R=302,L]

# Or if you wanted to proxy instead of redirecting, use this instead:
#RewriteRule ^ http://sitenotfound.mydomain.org/invalid-site.html [P,L]

Таким образом, динамический хост теперь будет проверять наличие каталога сайта, прежде чем обслуживать контент из него, и либо перенаправит, либо проксирует пользователя на удобную страницу объяснения. Похоже, такое поведение соответствует вашим потребностям?