1

使用 nginx时,auth_request只接受 4 个返回码:2xx401和. 处理这些需要设置。这很好,但所有返回这些代码的下游应用程序最终都将使用相同的处理方式。403500error_pageauth_requesterror_page

示例

location /test {
  auth_request /foo;
  error_page 500 /its-broke.html;
  proxy_pass http://bar;
}

如果auth_request返回,则显示 its-broke.html /foo500这是我想要的行为。但是,如果bar返回500its-broke.html 也会显示。我不想要这个。相反,我希望bar500 错误响应传输到浏览器。

auth_request会抓住任何5xx并处理它500,所以我不能只拥有fooreturn 520。这会导致以下错误,并且500无论如何都会返回:

auth request unexpected status: 520 while sending to client

有什么想法可以解决这个问题吗?在代理通过之前,我也找不到取消设置 error_page 的方法。

4

1 回答 1

1

你可以通过一些努力做到这一点

events {
    worker_connections 1024;
}
http {

    server {

        listen 80;

        location @autherror {

            return 500 "Auth returned 500";
        }

        location @proxy_api {

            proxy_pass http://127.0.0.1:8081;
        }

        location / {

            location /test {

                auth_request /auth;
                error_page 500 = @autherror;
                try_files dummy_non_existing_url = @proxy_api;
            }

        }
        location /auth {

            return 200 "auth passed";
        }

    }

    server {

        listen 8081;
        location / {
            return 200 "You came to $uri";
        }
        location /test2 {
            return 500 "Error from API";
        }
    }
}

API 测试的结果是

$ curl localhost/test
You came to /test

$ curl localhost/test2
Error from API

现在,如果我更改return 200 "auth passed";return 500 "auth failed";模拟身份验证 500 错误,我会得到

$ curl localhost/test
Auth returned 500
于 2017-11-05T09:37:16.133 回答