Я возился с сервером и сделал один из субдоменов прокси для службы, которая не всегда работает. В server
блок выглядит так:
server {
server_name servlet.example.org;
error_page 502 /error/down.html;
location / {
proxy_pass http://127.0.0.1:12510;
proxy_redirect default;
proxy_intercept_errors on;
}
location /error/ {
root /path/to/servlet;
autoindex off;
}
}
Это служит /path/to/servlet/error/down.html
на любой запрос, когда служба не работает, и это здорово.
Моя проблема в том, что я хотел бы сделать любой внешний запрос к /error/
вернуть код состояния 403 со своей собственной страницей ошибок, например forbidden.html
, также можно найти в /error/
папка. В internal
Директива звучит так, как будто это то, что я хочу, но возвращает 404s. Я не могу просто заменить ошибку 404 на всем сервере на ошибку 403 с помощью error_page
, потому что служба может возвращать собственные 404, и я хотел бы сохранить это.
Это возможно? Как бы я это сделал? Я пробовал, казалось бы, значимые комбинации internal
и error_page
но никуда не денешься.
За исключением этого, могу ли я хотя бы подать 403-й для всего, что иначе 404-й в /error/
? Т.е. down.html
и forbidden.html
отображаются нормально, но все остальное получает 403 и отображает forbidden.html
.
Я не могу довести сервер до 403 всего в /error/
внешне, но мне удалось занять второе место: до 403 все, что иначе не доступно.
Мне пришлось использовать перезапись, чтобы заставить его работать, потому что без него запрос на /error/
один только выдаст сообщение об ошибке nginx по умолчанию, а не пользовательское. Этого я до сих пор не могу понять.
server {
server_name servlet.example.org;
error_page 502 /error/down.html;
error_page 403 /error/forbidden.html; # other error_pages for the
error_page 404 /error/notfound.html; # proxy's output
# ...
location / {
proxy_pass http://127.0.0.1:12510;
proxy_redirect default;
proxy_intercept_errors on;
}
location = /error/ { # did you request /error/ ?
rewrite .* /error/x last; # not anymore!
} # we can also omit autoindex now
location /error/ {
root /path/to/servlet;
error_page 404 =403 /error/forbidden.html;
}
}