如何解决如何通过Nginx反向代理将具有相同HTTP状态码和Body的API Response转发给客户端
我目前正在对在 Laravel 中开发的 API 进行 dockerizing,我使用 Nginx 作为反向代理, 这是 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 Not Found 响应,但问题是 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 并且有更好的 API 反向代理?
解决方法
我想通了。问题不在于 nginx,而在于 PHP-FPM 容器,我没有命令容器使用 php.ini-production 文件作为 php.ini 配置文件。在 Dockerfile 中添加此命令修复了该问题,并且 HTTP 错误将按照我想要的方式通过 nginx 反向代理发回。
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。