使用nginx auth_request
时,只接受4个返回码:2xx
,401
,403
和500
。处理这些需要设置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的方法。
答案 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";