API 所有的响应状态码都是 200?

重现问题:

  1. 学习完 larabbs-weapp 上线的过程中,发现无论 dingo/apisetStatusCode 方法设置的 code 是什么,服务器都会返回一个 200http code,无论是服务器错误 5xx,还是认证错误 4xx,服务器都是 http code 返回的 200,贴一些代码和截图:

    public function index(Request $request, Topic $topic)
    {
        $topics = $topic->query()->paginate(20);
        // 为了方便测试在「话题列表」这里使用了 `setStatusCode`
        return $this->response->paginator($topics, new TopicTransformer())->setStatusCode(201);
    }

    技术债

大家不用太纠结 Tests 模块的响应,只是为了复现一下故障,总而言之就是 http code 没有根据 setStatusCode 的设置来响应给客户端。

解决思路:

  1. 之前碰到过一次 无论服务器设置的 http code 是什么,总是响应给客户端 500http code,打开日志,发现是缓存文件的权限问题,改一下权限即可解决;
  2. 起初碰到本文描述的问题的时候,确实没什么思路,为此搜索了一些文章,由于没有抓到关键词,检索出来的文章也没有成效;
  3. 首先,一样的代码在本机的 homestead 上运行一切正常,放到阿里服务器上便出现了这个问题,所以初步判断是服务器环境配置的问题;
  4. 得空还去翻了 dingo/apiissue ,发现了一个有相似问题的:where is the status code(204) when noContent() is called?,从这个 issue 进一步确定是服务器配置的原因导致的该问题;
  5. 因为服务器环境也比较简单,所以思考了一下排查顺序:nginx -> php-fpm -> php
  6. nginx.conf 中没有设置 http code 的关键词,判断可能是 include 的文件中导致的;
  7. 定位到 nginx.conf 站点配置文件中的 include fastcgi_params,发现 fastcgi_params 中有一串代码片段:
    # PHP only, required if PHP was built with --enable-force-cgi-redirect
    fastcgi_param  REDIRECT_STATUS    500;
    • 经过一番调试,发现不是这里的问题,但好在找到了一些关键词:redirectstatus
  8. 谷歌输入关键词检索:php fastcgi redirect_status,浏览了一些网址,猜测可能会在 php.ini 中有线索;
  9. 找到 php.ini 中没有注释的 cgi 相关配置:
    • cgi.force_redirect = 0
    • fastcgi.impersonate = 1
    • cgi.rfc2616_headers = 1
  10. 经过一番调式发现是 cgi.rfc2616_headers 这个参数导致的,设置为 0,即可解决此问题。

后记

  1. 解决了接口响应的问题,又发现了新的问题:
    • 微信小程序调用的接口必须支持 https,所以下一步就是为我的 larabbs 配置 https,详情请见下一篇文章 ~
api

刻意练习,日益精进。

讨论数量: 2

配置文件默认会设置cgi.rfc2616_headers这个?

1周前 评论
菜就多努力呀n (楼主) 1周前
likunyan

我的是被注释的,且默认值为 0。

Ubuntu 18.04、PHP 7.2

1周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!