мы ведем большой проект для разных клиентов, у каждого свой поддомен. Apache не должен выполнять какие-либо сценарии, если используется недопустимый поддомен. Вместо этого должна отображаться страница с ошибкой.
Работает:
это out zzz-default.conf, который является последним VHOST и соответствует всем запросам, которые не были перехвачены другим VHOST.
<VirtualHost *:80>
ServerName project.example.com
ServerAlias *.project.example.com
Redirect 404 /
DocumentRoot /var/www/html/
ErrorDocument 404 "This Subdomain does not exist."
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Что не работает:
ErrorDocument 404 /404.html
Этот файл находится в /var/www/html/
и содержит чистый html, без скриптов.
Наша проблема, похоже, заключается в правиле перенаправления, но нам нужно, чтобы оно соответствовало всем поддоменам и перезаписывалось на /
.
Если я включу это и вызову недопустимый поддомен, я получу
не обнаружена
Запрошенный URL / не найден на этом сервере.
Кроме того, произошла ошибка 404 Not Found. при попытке использовать ErrorDocument для обработки запроса.
Кто-нибудь знает почему?
редактировать: Другие VHOST определены как
<VirtualHost *:80>
ServerName client.project.example.com
Header always append X-Frame-Options SAMEORIGIN
</VirtualHost>
Include /path/to/local/client/httpd-vufind.conf
Есть 13 VHOST, определенных таким образом, а затем указанные выше zzz-default.conf
загружен.
Решение:
<VirtualHost *:80>
ServerName project.example.com
ServerAlias *.project.example.com
# CHANGED:
# return 404 for all requests expect 404.html
RedirectMatch 404 "^(/(?!404.html).*)"
# use custom 404 error document
ErrorDocument 404 /404.html
DocumentRoot /var/www/html/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Проблема в том, что «Перенаправление 404 /» предотвращает показ самого 404.html (настроенного с помощью оператора ErrorDocument). На это указывает сообщение об ошибке: «Кроме того, при попытке использовать ErrorDocument для обработки запроса произошла ошибка 404 Not Found».
Проблема в правиле перенаправления, которое соответствует всему, включая ваш ErrorDocument. Решение довольно простое: включить перенаправление в ответ 404, установив удаленный URL как ErrorDocument
:
<VirtualHost *:80>
ServerName project.example.com
ServerAlias *.project.example.com
DocumentRoot /var/www/html/
ErrorDocument 404 http://project.example.com/404.html
</VirtualHost>