2009-06-21 4 views
43

Nginx + PHP (на fastCGI) отлично работает для меня. Когда я ввожу путь к файлу PHP, который не существует, вместо того, чтобы получать страницу ошибки 404 по умолчанию (которая появляется для любого недопустимого файла .html), я просто получаю «Нет указанного входного файла».Nginx - Пользовательская настройка 404 страница

Как настроить эту страницу ошибки 404?

ответ

33

Свойство error_page используется в nginx config.

Например, если вы собираетесь установить страницу 404 ошибки в /404.html, используйте

error_page 404 /404.html; 

Настройка страницы 500 ошибки для /500.html так же просто, как:

error_page 500 /500.html; 
+2

Хотя связь в порядке и ответ минимально работает без ссылки, он может извлечь выгоду из дополнительной проработки. – Paul

+0

@Paul I 100% согласен с вами в этом, поэтому я добавил некоторые примеры кода для этого ответа ;-) –

101

Вы можете настроить пользовательскую страницу ошибок для каждого блока местоположения в вашем nginx.conf или глобальную страницу ошибок для сайта в целом.

Чтобы перенаправить к простой 404 не нашел страницу для конкретного места:

location /my_blog { 
    error_page 404 /blog_article_not_found.html; 
} 

Сайт широкий 404 страница:

server { 
    listen 80; 
    error_page 404 /website_page_not_found.html; 
    ... 

Вы можете добавить стандартные коды ошибок вместе, чтобы иметь одну страницу для нескольких типов ошибок:

location /my_blog { 
    error_page 500 502 503 504 /server_error.html 
} 

Чтобы перенаправить на совершенно другой сервер, assumin г вы имели вышестоящий сервер с именем server2, определенными в вашем HTTP разделе:

upstream server2 { 
    server 10.0.0.1:80; 
} 
server { 
    location /my_blog { 
     error_page 404 @try_server2; 
    } 
    location @try_server2 { 
     proxy_pass http://server2; 
    } 

manual может дать вам более подробную информацию, или вы можете произвести поиск Google для терминов nginx.conf и error_page для реальных жизненных примеров в Интернете.

+1

Знаете ли вы, можно ли использовать шаблон с ошибкой? Что-то вроде 'error_page 50 * = /error_50x.html;'? –

+0

Подстановочные знаки запрещены - страница wiki для этой серверной команды находится здесь http://wiki.nginx.org/NginxHttpCoreModule#error_page - также они не нужны, поскольку коды ошибок определяются протоколом HTTP, который не изменяется очень часто. См. Http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html или http://en.wikipedia.org/wiki/List_of_HTTP_status_codes для полного списка, и я полагаю, добавляю любые номера, которые вам нравятся, если вы думаете, что там будут нужны будущие коды. –

+1

Спасибо. В настоящее время у меня есть 3 правила: '/ 403.html','/404.html' и '/ 5xx.html', все они имеют один и тот же« root », но почему-то, если я укажу местоположение' ~/(?: 40 [ 34] | 5xx) [.] Html $ 'он будет отображать страницы ошибок nginx по умолчанию, однако, если я использую нережимное местоположение, оно работает. У вас есть идеи, почему это происходит? –

27

Параметр «error_page» недостаточно.

Самым простым решением является

server{ 
    root /var/www/html; 
    location ~ \.php { 
     if (!-f $document_root/$fastcgi_script_name){ 
      return 404; 
     } 
     fastcgi_pass 127.0.0.1:9000; 
     include fastcgi_params.default; 
     fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; 
    } 

Кстати, если вы хотите Nginx обрабатывать 404 статус, возвращаемый PHP скрипты, вам нужно добавить

fastcgi_intercept_errors на;

E.g.

location ~ \.php { 
     #... 
     error_page 404 404.html; 
     fastcgi_intercept_errors on; 
    } 
+0

Большое вам спасибо за публикацию этого @Grigori, я использовал ваш код выше, чтобы исправить мою проблему nginx –

+0

Как насчет каких-либо файлов Php?!? –

+1

Отлично, 'fastcgi_intercept_errors on' именно то, что я искал. – wildpeaks

14

Эти ответы больше не рекомендуется, так как try_files работает быстрее, чем if в этом контексте. Просто добавьте в try_files вашем местоположении блока PHP, чтобы проверить, существует ли файл, в противном случае возвращает 404.

location ~ \.php { 
    try_files $uri =404; 
    ... 
} 
28

Будь осторожны с синтаксисом!Великая Черепаха использовали их как взаимозаменяемые, но:

error_page 404 = /404.html;

Вернется страницу 404.html с кодом состояния 200 (потому что = уже передал, что к этой странице)

error_page 404 /404.html;

Will верните страницу 404.html с кодом ошибки 404 (оригинал).

https://serverfault.com/questions/295789/nginx-return-correct-headers-with-custom-error-documents

+1

Это важная деталь! –

+1

И через 2 года я исправил свой код. Спасибо dhr_p. :) –

Смежные вопросы