#nginx #redirect #nginx-config #http-status-code-503
#nginx #перенаправление #nginx-config #http-status-code-503
Вопрос:
Я узнал, как заставить NGINX возвращать 503
страницы ошибок клиента, но я не могу выяснить, как сделать следующее:
Пример конфигурационного файла:
location / {
root www;
index index.php;
try_files /503.html =503;
}
error_page 503 /503.html;
location = /503.html {
root www;
}
Как вы можете видеть, согласно приведенному выше коду, если вызываемая страница 503.html
найдена в моем корневом каталоге, сайт вернет эту страницу пользователю.
Но кажется, что, хотя приведенный выше код работает, когда кто-то просто посещает мой сайт, вводя
она не перехватывает запросы типа:
С моим кодом пользователь все еще может видеть страницу профиля или любые другие страницы помимо index.php
.
Вопрос:
Как мне перехватывать запросы на все страницы моего сайта и пересылать их на 503.html
любую 503.html
страницу, которая присутствует в моей корневой папке?
Ответ №1:
Приведенная ниже конфигурация работает для почти последней стабильной версии nginx 1.2.4
. Я не смог найти способ включить страницу обслуживания без использования if
но, по-видимому, согласно IfIsEvil, это нормально if
.
- Чтобы включить обслуживание
touch /srv/sites/blah/public/maintenance.enable
. Вы можетеrm
этот файл отключить. - Ошибка
502
будет отображена на503
, чего хочет большинство людей. Вы не хотите сообщать Google502
. - Пользовательские
502
и503
страницы. Ваше приложение будет генерировать другие страницы ошибок.
В Интернете есть другие конфигурации, но они, похоже, не работают в последней версии nginx.
server {
listen 80;
server_name blah.com;
access_log /srv/sites/blah/logs/access.log;
error_log /srv/sites/blah/logs/error.log;
root /srv/sites/blah/public/;
index index.html;
location / {
if (-f $document_root/maintenance.enable) {
return 503;
}
try_files /override.html @tomcat;
}
location = /502.html {
}
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
error_page 503 @maintenance;
error_page 502 =503 /502.html;
location @tomcat {
client_max_body_size 50M;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-Proto http;
proxy_pass http://tomcat;
proxy_redirect off;
}
}
Комментарии:
1. Спасибо вам за это. Я также не смог найти способ сделать это без использования
if
. Рад видеть, что это приемлемое использование!2. Я обнаружил, что это может привести к сбою, если пользователь публикует, а не получает — в этом случае они получают 405 пустых ответов вместо 503. Не уверен, как это решить. Перепробовал все, что смог найти.
Ответ №2:
Обновлено: изменено «if -f» на «try_files».
Попробуйте это:
server {
listen 80;
server_name mysite.com;
root /var/www/mysite.com/;
location / {
try_files /maintenance.html $uri $uri/ @maintenance;
# When maintenance ends, just mv maintenance.html from $root
... # the rest of your config goes here
}
location @maintenance {
return 503;
}
}
Подробная информация:
https://serverfault.com/questions/18994/nginx-best-practices
Комментарии:
1. try_files — лучшая практика. Кроме того, она не отсутствует. Это просто неполно.
2. @Vini в чем разница между «не пропущено» и «неполно», для меня это одно и то же. Я обновил пример, включив try_files вместо if -f. Надеюсь, это поможет.
3. Спасибо, Кен. Кстати, что делает $ uri? Я вижу это дважды подряд.
4. Это служит /maintenance.html с кодом состояния 200. Как страница может обслуживаться с надлежащим статусом 503?
5. Это никогда не вернет
503
http-код, если у вас есть файл,/maintenance.html
посколькуtry_files
инструкция остановилась бы на этом.
Ответ №3:
Оба других ответа верны, но просто добавлю, что если вы используете внутренние прокси, вам также необходимо добавить proxy_intercept_errors on;
на один из ваших прокси-серверов.
Так, например…
proxy_intercept_errors on;
root /var/www/site.com/public;
error_page 503 @503;
location @503 {
rewrite ^(.*)$ /scripts/503.html break;
}
Ответ №4:
Годы спустя вот что я в настоящее время использую для полностью пользовательских сообщений об ошибках.
Страницы ошибок HTML хранятся в каталоге /http-error, расположенном в корневом каталоге вашего сайта.
###### ##### ##### #### ##### ##### ## #### ###### ####
# # # # # # # # # # # # # # # # #
##### # # # # # # # # # # # # # ##### ####
# ##### ##### # # ##### ##### ###### # ### # #
# # # # # # # # # # # # # # # # #
###### # # # # #### # # # # # #### ###### ####
# ------------------------------------------------------------------------------
# HTTP > SERVER > ERROR_PAGE :: WWW.EXAMPLE1.COM
# ------------------------------------------------------------------------------
# Optionally include these error pages as a file.
# include /etc/nginx/conf.d/www.example1.com_error_page.conf;
# ------------------------------------------------------------------------------
# Description
# Defines the URI that will be shown for the specified errors.
#
# ------------------------------------------------------------------------------
#
#
# 400 Bad Request
error_page 400 @400;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 400 error must be returned in this manner for custom http error pages to be served correctly.
location @400 {
rewrite ^(.*)$ /http-error/400-error.html break;
}
# 401 Unauthorized
error_page 401 @401;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 401 error must be returned in this manner for custom http error pages to be served correctly.
location @401 {
rewrite ^(.*)$ /http-error/401-error.html break;
}
# 403 Forbidden
error_page 403 @403;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 403 error must be returned in this manner for custom http error pages to be served correctly.
location @403 {
rewrite ^(.*)$ /http-error/403-error.html break;
}
# 404 Not Found
error_page 404 @404;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 404 error must be returned in this manner for custom http error pages to be served correctly.
location @404 {
rewrite ^(.*)$ /http-error/404-error.html break;
}
# 405 Method Not Allowed
# unreachable do to nature of the error itself. here only for completeness.
# error_page 405 /http-error/405-error.html break;
# Request Timeout
error_page 408 @408;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 408 error must be returned in this manner for custom http error pages to be served correctly.
location @408 {
rewrite ^(.*)$ /http-error/408-error.html break;
}
# 500 Internal Server Error
error_page 500 @500;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 500 error must be returned in this manner for custom http error pages to be served correctly.
location @500 {
rewrite ^(.*)$ /http-error/500-error.html break;
}
# 502 Bad Gateway
error_page 502 @502;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 502 error must be returned in this manner for custom http error pages to be served correctly.
location @502 {
rewrite ^(.*)$ /http-error/502-error.html break;
}
# 503 Service Unavailable
error_page 503 @503;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 503 error must be returned in this manner for custom http error pages to be served correctly.
location @503 {
rewrite ^(.*)$ /http-error/503-error.html break;
}
# 504 Gateway Time-out
error_page 504 @504;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 504 error must be returned in this manner for custom http error pages to be served correctly.
location @504 {
rewrite ^(.*)$ /http-error/504-error.html break;
}
# 505 HTTP Version Not Supported
error_page 505 @505;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 505 error must be returned in this manner for custom http error pages to be served correctly.
location @505 {
rewrite ^(.*)$ /http-error/505-error.html break;
}
# 511 HTTP Version Not Supported
error_page 511 @511;
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# An http 511 error must be returned in this manner for custom http error pages to be served correctly.
location @511 {
rewrite ^(.*)$ /http-error/511-error.html break;
}
# #### #### ## ##### # #### # #
# # # # # # # # # # # ## #
# # # # # # # # # # # # #
# # # # ###### # # # # # # #
# # # # # # # # # # # # ##
###### #### #### # # # # #### # #
# example1.com internal error pages located at...
location /http-error/ {
# Specifies that a given location can only be used for internal requests.
# returns a 404 Not Found http error if accessed directly.
internal;
}