На сервере Apache2, связанном с DNS, который включает запись с подстановочным знаком, например * .example.com, субдомены, которые не определены как ServerNames ни в одном VirtualHosts, указывают на первый определенный VirtualHost, в моем примере это 000-default.
Мой вопрос:
Как можно получить неиспользуемые поддомены (поддомены, не используемые ни в каких виртуальных хостах), чтобы вернуть запрашивающему клиенту ошибку 404? Желательно, чтобы это также отображалось в журналах сервера как 404.
Я рассмотрел следующие возможности:
Проблема с этим методом в том, что когда кто-то ссылается на ваш сайт как this.company.sucks.example.com, клиент увидит вашу домашнюю страницу или, в моем случае, 000-default, если я не перенаправляю. Благодаря Майк за указание на это. (регулярное выражение для «сосать» и т. д. определенно не вариант)
Apache не любит этот бит, предупреждая при каждой перезагрузке. Помимо предупреждения, все в порядке. Это похоже на взлом. Кому-нибудь это кажется проблемой (пусть даже небольшой)?
Это сбивает с толку и делает следующие вещи чрезмерно сложными: скажем, например, вы используете субдомен для каждого пользователя (по-видимому, большая причина для использования DNS с подстановочными знаками), и пользователи имеют возможность просматривать профили друг друга в username.example. com. Это решение сбивает с толку пользователя и совершенно не то, что я хочу делать.
Мое идеальное решение позволит пользователю узнать, что по указанному им 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, а не меня. Этот человек действительно кладезь знаний!)