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

Пользовательская страница ошибки 404 nginx для виртуального хоста

Я запускаю несколько виртуальных хостов на nginx, и я хотел бы, чтобы у каждого из них были свои собственные страницы 404. У каждого виртуального хоста есть свой собственный nginx.conf, который я включаю в свой глобальный nginx.conf.

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

server{
    listen 80;
    server_name www.foo.com;
    expires     1M;
    access_log  /srv/www/foo/logs/acces.log;
    error_log   /srv/www/foo/logs/error.log;

    error_page 404 /404.html;

    location / {
        root    /srv/www/foo/public_html;
        index   index.html;
        rewrite ^/(.*)/$ /$1 permanent;
        try_files "${uri}.html" $uri $uri/ =404;
    }

    location = /404.html {
        internal;
    }       
}

Само по себе 404'ing нормально, но когда возвращается код состояния 404, отображается страница 404 nginx по умолчанию, а не пользовательская страница 404.html, которая находится в корне сайта.

Я пробовал использовать абсолютный путь как через файловую систему, так и через URI сайта на страницу с ошибкой, и я попытался поместить директиву error_page в блок местоположения. Ни один из них не работал. Я подозреваю, что проблема возникает из-за моей комбинации rewrite и try_files, которую я использую для «предварительной настройки» своих URL-адресов.

Во-первых, установите корневую директиву вне блока location - в данном случае над директивой error_page -. Посмотреть nginx страница подводных камней. Причина этого в том, что многие директивы (включая error_page) должны знать пути относительно чего-либо - и все пути считаются относительными (т.е. /404.html находится не в корне вашей файловой системы - он относительно вашего документа корень).

server{
    #listen 80; - not needed
    server_name www.foo.com;
    root    /srv/www/foo/public_html;
    expires     1M;
    access_log  /srv/www/foo/logs/access.log;
    error_log   /srv/www/foo/logs/error.log;

    error_page 404 /404.html;

    location / {
        index   index.html;
        rewrite ^/(.*)/$ /$1 permanent;
        try_files "${uri}.html" $uri $uri/ =404;
    }

    location = /404.html {
        internal;
    }       
}

Если описанные выше действия не помогли устранить вашу ошибку, увеличьте подробность вашего журнал ошибок (например, в 'info') и посмотрите, какую страницу фактически обслуживает nginx, когда вы набираете 404.