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

Apache 2.4 ErrorDocument для нескольких поддоменов

мы ведем большой проект для разных клиентов, у каждого свой поддомен. 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>