Я запускаю несколько виртуальных хостов на 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.