Ниже приведен пример конфигурации сервера Nginx. Без блока местоположения «волшебный талисман» проксируемое содержимое ошибки приводит к тому, что отображается страница Nginx 404, а не настраиваемая страница ошибки.
Удаление директивы proxy_intercept_errors обеспечивает правильную страницу проксируемой ошибки с правильными заголовками кода ошибки http.
Страницы ошибок без прокси отображаются правильно независимо от наличия магического талисмана.
Есть идеи относительно того, что именно происходит?
server {
server_name mydomain.com "";
listen 80;
root /var/www;
error_page 400 401 402 403 404 500 501 502 503 504 /admin/error_page.htm;
proxy_intercept_errors on;
location /proxy/ {
proxy_read_timeout 60s;
proxy_set_header Host $host;
proxy_pass http://myservers;
}
location /test404/ {
return 404;
}
location /admin/ { # this line constitute a magical talisman that fixes proxied error interception(???)(!)
rewrite ^(/admin)(.*)$ /admin$2 break;
}
}
Мне очень жаль, что этот ответ срабатывает поздно, но на данный момент, с текущей стабильной версией v1.8.1, предоставленная вами конфигурация должна работать без каких-либо талисман.
Если вы предоставили версию, над которой экспериментировали, было бы неплохо проверить, исправлена ли ошибка или была ли конфигурация некорректной.
Я предлагаю вам дважды проверить свою конфигурацию, так как вам это точно не понадобится /admin/
местонахождение и его содержание rewrite
директива. Будьте особенно осторожны при удалении всего, что не является частью этого теста (и что вы не показываете), поскольку это может помешать.
В крайнем случае, вы можете попробовать следующий, успешно протестированный фрагмент конфигурации, медленно интегрировать изменения и посмотреть, в какой момент результаты расходятся с ожиданиями:
server {
listen 80;
listen [::]:80;
server_name example.org;
location /proxy {
return 418 "Host: $host, Connection: $http_connection";
}
}
server {
listen 80;
listen [::]:80;
server_name example.com;
root /var/ious/files;
error_page 418 = /error_page.html;
proxy_intercept_errors on;
location /proxy {
proxy_pass http://example.org;
}
}