Назад | Перейти на главную страницу

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

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