从Nginx配置中回复200而无需提供文件


122

我已将Apache配置为发送200响应而无需使用此配置行提供任何文件

Redirect 200 /hello

我可以用Nginx做到吗?我不想提供文件,我只希望服务器以200响应(我只是在记录请求)。

我知道我可以添加索引文件并实现相同的功能,但是在配置中执行该操作意味着可以减少出错的几率。

Answers:


261

是的你可以

location / {
    return 200 'gangnam style!';
    # because default content-type is application/octet-stream,
    # browser will offer to "save the file"...
    # if you want to see reply in browser, uncomment next line 
    # add_header Content-Type text/plain;
}

1
如何在响应中添加换行符?gangnam\nstyle
2015年

1
@tback当然,您是
cadmi

4
add_header对我不起作用,因为它添加了另一个标头而不是替换旧的“ Content-type”。在我的响应中,我有2个'Content-type'标头:$ curl -v localhost / healthcheck / h1_pio> GET / healthcheck / h1_pio HTTP / 1.1> User-Agent:curl / 7.38.0> Host:localhost> Accept:/ > <HTTP / 1.1 200 OK <日期:2016年10月11日星期二13:27:53 GMT <内容类型:应用程序/八位字节流<内容长度:25 <连接:保持活动<内容类型:application / json
jmcollin92

1
@ jmcollin92您的评论与提出的问题以及给出答案的问题无关。因为您显然拥有某种proxy_pass,fascgi_pass等...,但是我仍然回答位置/ healthcheck / h1_pio {#proxy_pass blablabla所需的东西;proxy_hide_header内容类型;add_header内容类型application / json; },请在正确的位置正确地提出您的问题
cadmi

6
如果您在其他地方声明了一个现有的default_type,则可能发生@ jmcollin92。您可以default_type text/plain;在位置块内部代替add_header指令来覆盖它。
tjb1982 '17

20

您确实需要使用204,因为Nginx不允许200没有响应主体。要发送204,您只需在适当的位置使用return指令即可return 204;


如果尝试通过浏览器查看此内容,则看起来它什么也没做。那是故意的。您没有提供任何服务(204),它什么也不显示。要证明您为204服务,请使用curl
jnovack

4

根据状态码定义,我相信您希望它是204,而不是200。响应中的资源需要200。否则我怀疑大多数理智的浏览器都会对此感到困惑。您可以使用的另一个是304,用于缓存内容。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


当然,将其设置为204,我该怎么办?尽管我非常怀疑任何浏览器都会被一个空荡荡的身体所迷惑。
Theo

1
空的主体仍然是带有对象的响应,例如空白的index.html。您要求提供的响应为200,但没有附加资源(不提供文件)。至于如何在nginx上精确地执行此操作,我需要亲自检查一下,我只在apache上执行过一次,所以我记不起来了。
sandroid 2010年

304似乎会为调试和临时返回之类的东西发送所有错误的信号。
卡扎伊

2

要完成@Martin Fjordval的回答,请注意,如果您使用这样的配置进行健康检查。

虽然204HTTP代码在语义上非常适合运行状况检查(没有内容的成功指示),但某些服务并不认为它是成功的。

即,我遇到了Google Cloud负载均衡器的问题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.