Почему для правильной работы директива Nginx proxy_intercept_errors требует перезаписи?

8

Ниже приведен пример конфигурации сервера 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;
    }
}
Обри Фалконер
источник

Ответы:

4

Я сожалею, что этот ответ появился в конце, но на данный момент, с текущей стабильной версией 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;
    }
}
Бернард Россет
источник
Спасибо, Бернард. Я отмечаю ваш ответ как принятый, так как прошло достаточно времени, и я больше не помню, с какой версией Nginx я тестировал, когда был задан исходный вопрос.
Обри Фальконер