nginx auth_request错误处理(未设置error_page?)

时间:2017-11-02 20:43:29

标签: nginx auth-request

使用nginx auth_request时,只接受4个返回码:2xx401403500。处理这些需要设置error_page。这适用于auth_request,但返回这些代码的所有下游应用最终都会使用相同的error_page处理。

实施例

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

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

500会抓住任何auth_request并将其作为5xx处理,因此我不能让500返回foo。这会导致以下错误,并且无论如何都会返回520

500

有什么想法绕过这个?在代理传递之前,我找不到解除error_page的方法。

1 个答案:

答案 0 :(得分:0)

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

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        listen 443 ssl;

        root /var/www/html;
        index index.php index.html;

        server_name _;
        ssl_certificate /etc/nginx/ssl/csr/ssl_altr/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/csr/ssl_altr/nginx.key;

        location / {
                try_files $uri $uri/ =404;
        }

        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;

        location = /50x.html {
                root /var/www/html;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

API测试的结果是

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";
        }
    }
}

现在,如果我将$ curl localhost/test You came to /test $ curl localhost/test2 Error from API 更改为return 200 "auth passed";以模拟身份验证500错误,我会

return 500 "auth failed";