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

Подстановочный DNS, VirtualHosts на apache2, 404 для неиспользуемых поддоменов

На сервере Apache2, связанном с DNS, который включает запись с подстановочным знаком, например * .example.com, субдомены, которые не определены как ServerNames ни в одном VirtualHosts, указывают на первый определенный VirtualHost, в моем примере это 000-default.

Мой вопрос:

Как можно получить неиспользуемые поддомены (поддомены, не используемые ни в каких виртуальных хостах), чтобы вернуть запрашивающему клиенту ошибку 404? Желательно, чтобы это также отображалось в журналах сервера как 404.

Я рассмотрел следующие возможности:

Мое идеальное решение позволит пользователю узнать, что по указанному им URL нечего просматривать. Желательно с 404 и записью журнала ошибок для введенного адреса (а не какого-либо другого адреса).

Любая помощь будет принята с благодарностью!

У меня недавно была такая же проблема, и я не мог найти душу до сих пор. Лучшим вариантом оказывается использование

Redirect 404 /

или (как было предложено ранее)

RedirectMatch 404 /.*

директива в (первом) виртуальном хосте по умолчанию, который, очевидно, не должен использоваться. Vhost потенциально может быть `` поддельным '', поэтому в начале вашего файла конфигурации vhost может быть что-то вроде следующего:

<VirtualHost *:80>
ServerName default #fake name, unused domains default here
Redirect 404 /
</VirtualHost>

<VirtualHost *.80>
ServerName example.tld
........
</VirtualHost>

Хотя пахнет хаком.

Вы можете настроить виртуальный хост по умолчанию со следующим, согласно документации Apache:

RedirectMatch 404 /.*

http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect

Сообщите мне, если это не сработает.

Это может помочь: я пытался решить проблему с поддоменом с подстановочными знаками, которую поставил перед собой ранее, и нашел пример кода из webmasterworld (из всезнающего jdMorgan), который, кажется, производит то поведение, которое вам нужно (404 для несуществующего контента ):

#jdMorgan, again
#http://www.webmasterworld.com/apache/3906038.htm

# If the request is not for the the main domain or the www subdomain
rewriteCond %{HTTP_HOST} !^(www\.)?foo\.com
# get the requested subdomain name into variable %2
rewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.foo\.com
# and if not already rewritten to subdomain's subdirectory
rewriteCond $1 !^subdomains/
# internally rewrite to prefix "/subdomains/<subdomain-name>/" to the client-requested URL-path
rewriteRule ^(.*)$ /subdomains/%2/$1 [L]

Если файлы существуют в /subdomains/bar, и я перехожу к http://bar.foo.com, отображается содержимое. Если я перейду к http://baz.foo.com, Я получаю 404 Not Found (и дополнительный информационный 404, поскольку я не указал ErrorDocument) - это также появляется в error_log.

Это то, что тебе нужно? Использование этого позволяет вам видеть недоступный контент в error_log, или действительно создать страницу 404 исключительно для захвата запросов 404 и их регистрации.

(Опять же, вы должны поблагодарить jdMorgan на WMW, а не меня. Этот человек действительно кладезь знаний!)