Сайт обработки не найден и страница не найдена с динамическим массовым виртуальным хостингом
Недавно я настроил массовый виртуальный хостинг в Apache, так что все, что нам нужно сделать, это создать каталог для создания нового vhost. Затем мы также используем подстановочный DNS для сопоставления всех поддоменов с сервером, на котором работает наш экземпляр Apache.
Это отлично работает, однако теперь у меня возникают проблемы с настройкой его на переключение на соответствующую страницу по умолчанию /error-page, когда каталог vhost не существует.
Похоже, что проблема связана с моим желанием справиться с двумя ошибочными условиями:
- vhost not found, т.е. не найдено ни одного каталога, соответствующего хосту, указанному в заголовке HTTP-хоста. Мне бы хотелось, чтобы на этом сайте отображалась страница с ошибкой, которая не найдена.
- На странице 404 не найдено состояние vhost.
Кроме того, у меня есть специализированный "API" vhost в своем собственном блоке 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-блок используется по умолчанию, поэтому я использую его здесь, чтобы перехватить весь сайт. Затем у меня есть мой vhost API, и, наконец, мой массовый блок vhost.
Таким образом, для домена, который не соответствует первым двум ServerName и не имеет соответствующего каталога в /var/www/vhosts/
Я бы ожидал, что он перейдет к первому vhost, однако при такой настройке все домены переходят на мой сайт по умолчанию - not-found. Почему это?
Поместив сначала блок mass-vhost, я могу заставить масс-vhosts разрешаться правильно, но не мой vhost-not-found-site... и в этом случае я не могу найти способ различить страницу уровень 404 в vhost, и случай, когда VirtualDocumentRoot не может найти каталог vhost (похоже, он также использует 404).
Любая помощь из этой привязки очень ценится!
1 ответ
Я бы ожидал, что он перейдет к первому vhost, однако при такой настройке все домены переходят на мой сайт по умолчанию -not-found. Почему это?
Нет никакой логики переключения между различными виртуальными хостами - как только запрос назначается одному, он становится окончательным.
Когда у тебя нет ServerName
или же ServerAlias
в вашем динамическом блоке vhost вы зависите от поведения "первый vhost для загрузки по умолчанию" для назначения запросов этому vhost. Когда это не первый vhost для загрузки, он по сути инертен; нет возможности получить запрос.
Моя рекомендация о том, как справиться с этим, состоит в том, чтобы поведение "сайт не найден" было либо прокси-сервером, либо перенаправлением на рабочий сайт (который затем отображает страницу "здесь нет содержимого!"), А не вариант вашего 404. стр.
Переместить sitenotfound.mydomain.org
vhost down, и верните динамический наверх, чтобы он был по умолчанию. Мы будем использовать его, чтобы открыть нашу дружественную страницу "здесь нет сайта".
Затем давайте дадим динамическому 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]
Таким образом, динамический хост теперь будет проверять наличие каталога сайта, прежде чем отправлять из него содержимое, и перенаправлять пользователя или перенаправлять его на дружественную страницу объяснения. Похоже ли это на ваши потребности?