忽略 nginx 服务器 error_page 配置中某个特定位置指令

忽略 nginx 服务器 error_page 配置中某个特定位置指令

我已经为我的服务器设置了静态错误页面,但我想忽略以 开头的 URL,/api/以便那里的处理程序可以使用非 200 代码进行响应,但不返回静态错误页面。

现有的配置如下:

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  example.com;
    root         /var/www/html/;
    index        index.php;

    error_log    /var/log/nginx/error.log;
    access_log   /var/log/nginx/access.log;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_intercept_errors on;
        fastcgi_index app.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 600;
    }

    error_page 404 /error/404.html;
    error_page 500 502 503 504 /error/50x.html;
    location ^~ /error/ {
        root /usr/share/nginx/html/;
    }
}

所以我想我需要添加一个新位置,例如:

location /api/ {
}

但我不知道该怎么告诉它不是遵循服务器的error_page规则。

答案1

好吧,我也遇到了同样的问题,但最终还是找到了解决方案。

就我所能达到的最高水平而言:

server {

    include /etc/nginx/boilerplate/fancyerror_and_intercept.conf;


    location ~ (?<target>.*) {
        proxy_pass http://$backend;
    }

}

/etc/nginx/boilerplate/fancyerror_and_intercept.conf包含:

error_page 404 /40x.html;
error_page 403 /40x.html;
error_page 405 /40x.html;
error_page 500 /50x.html;
error_page 501 /50x.html;
error_page 502 /50x.html;
error_page 503 /50x.html;


location = /40x.html {
    root /etc/nginx/error_pages;
}
location = /50x.html {
    root /etc/nginx/error_pages;
}


more_set_headers -s '404 403 405 500 501 502 503 504' 'X-Robots-Tag: noindex, nofollow';
proxy_intercept_errors on;

为了排除/api/路线(位置以 开头/api/并且可以包含其后的任何内容),添加以下内容:

location ~ ^/api/ {
    error_page 527 error.html;
    proxy_intercept_errors off;
    proxy_pass http://$backend;
}

本质上,该/api/位置是一般位置的重复,但重新定义了 error_page 并将拦截错误设置为关闭。

这是有效的,因为Tim 之前曾说过,该error_page指令会重置任何预定义的 error_pages。我选择了错误代码527,因为我们不使用 CloudFlare参见维基百科,HTTP 状态代码列表#Cloudflare。由于我们proxy_pass已请求,您的里程可能会有所不同,并且您可能需要将其更改proxy_intercept_errors off;fastcgi_intercept_errors off;

答案2

文档

当且仅当当前级别上没有定义 error_page 指令时,这些指令才会从上一级别继承。

这意味着你只需要为你不感兴趣的一个代码定义一个 error_page,其余的应该重置。这论坛帖子支持这一点。

location /api {
  error_page 499 error.html
}

尝试一下,然后报告你的发现。

答案3

你可以使用这个:

location /api {
    try_files $uri $uri/ /path/to/api/handler;
}

这样,nginx 将首先检查/api目录下是否存在真实文件,如果没有找到匹配项,则将处理传递给您想要使用的处理程序。

相关内容