如何通过Nginx反向代理将具有相同HTTP Status Code和Body的API Response转发给客户端

How to forward API Response with the same HTTP Status Code and Body through Nginx reverse proxy to the Client

我目前正在对 Laravel 中开发的 API 进行 docker 化,我正在使用 Nginx 作为 reverse_proxy, 这是 conf.d 文件

server {
listen 80;
index index.php index.html;
root /var/www/public;
client_max_body_size 32M;

fastcgi_intercept_errors on;
proxy_intercept_errors on;

location / {
    try_files $uri /index.php$is_args$args;
}

location ~ \.php$ {

    add_header Access-Control-Allow-Origin http://foo.bar;
    add_header Access-Control-Max-Age 3600;
    add_header Access-Control-Expose-Headers Content-Length;
    add_header Access-Control-Allow-Headers Range;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass laravel:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;

    internal;
}

我收到内部服务器响应正文和 404 未找到响应,但问题是 HTTP 状态代码始终为 200。 我需要将 HTTP 状态代码按原样发送给发出请求的客户端,因为我将 401、403 和其他代码用于 Web 应用程序客户端应用程序,就像这样

if ($isAuthenticated) {
   return $token
} else { 
   return response()->json(['error'='Unauthorized','attempts'=$number ],401);
}

然后 Ajax 捕获 401 错误以向用户显示特定警报。 Nginx 总是发送回 200 来妨碍这样做。我尝试设置 fastcgi_intercept_errors 和 proxy_intercept_errors,但它仍然不起作用。我使用的图像是 nginx:1.19.8-perl,我尝试了 nginx:1.17-alpine 图像。有什么办法可以做到这一点?或者可能我将 Nginx 用于错误的目的并且有更好的 APIs 反向代理?

我明白了。问题不在于 nginx,而在于 PHP-FPM 容器,我没有命令容器使用 php.ini-production 文件作为 php.ini 配置文件。在 Dockerfile 中添加这个命令解决了这个问题,并且 HTTP 错误正在按照我想要的方式通过 nginx 反向代理发回。

RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"