Nginx返回一个带有伪造200状态码的空JSON对象

10
我们有一个运行在 Nginx 上的 API,应该返回 JSON 对象。由于服务器负载很高,我们进行了许多性能优化。API 从客户端接收 ID。服务器有一堆代表这些 ID 的文件。所以如果找到 ID 文件,后端将返回该文件的内容(即 JSON)。如果文件不存在,则不会调用后端,Nginx 只会发送404状态码,这样可以节省性能(无需运行任何后端系统)。
现在我们遇到了一个问题。由于我们仍然必须支持旧系统,不能为客户端提供404页面,否则会出现问题。我想到的解决办法是返回一个空的JSON字符串({}),并使用“假”的200状态代码。这必须是一个高性能的解决方案,以便仍然能够处理所有负载。
是否可能实现此功能,如果可以,请说明如何实现?

如果你已经到了返回404的地步(基于文件是否存在的条件),为什么不返回状态码为200的所需响应(空JSON对象)呢? - marekful
2个回答

20

我如何从代理服务器返回特定的响应? 如果我使用了auth_subrequest模块。 - lobengula3rd
在您的示例中,Content-Type标头设置为application/octet-stream。我无法弄清如何更改Content-Type。使用add_header可以添加另一个Content-Type而不是替换它。 - jmcollin92
@jmcollin92 请查看文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type 看起来您在配置中的某个地方将此指令设置为 application/octet-stream - VBart
没有,我找到了一个解决方案,使用这行代码:more_set_headers -t 'application/octet-stream' 'Content-Type: application/json'; 需要添加nginx-extras包(apt-get install nginx-extras)。 - jmcollin92
1
@jmcollin92,你应该设置default_type指令。就这样。你不需要任何额外的东西。 - VBart

3

您可以在文档根目录下创建一个名为empty.json的文件,其中只包含一个空对象{}

然后在您的nginx配置中,在location块中添加以下行:

try_files $uri /empty.json;

( 了解更多关于try_files的信息 )

这将检查客户端请求的文件是否存在,如果不存在,则只显示 empty.json。这会产生一个200 HTTP OK,并向请求的客户端显示 {}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接