nginx + fcgiwrapper 偶尔出现问题:传递的是 application/octet-stream 而不是 text/plain

4

我是这个论坛的新成员,这是我的第一个问题。

我已经设置了一个nginx服务器+fcgiwrapper来运行用户请求的程序(没有PHP)。

为了测试,我有一个简单的bash脚本,它显示环境变量并设置两个cookie,第二个bash脚本以text/plain格式打印“Hello World”,另一个bash脚本以text/html格式打印“Hello World”。

另一个用C编写的程序应该从stdin读取文本,解析它并基于输入输出文本到stdout,请求web浏览器应该以text/plain格式显示它(请求浏览器需要使用POST)。

然而,有时它会将返回的文本显示为"text/plain"(这是它应该做的),但有时浏览器会想要下载返回的文本,就好像它是"application/octet-stream"一样。

但是,如果我在准备好的环境中测试C程序

Environment Variables:
CONTENT_LENGTH=30
REQUEST_METHOD=POST
HTTP_COOKIE=NAME=TEST; ID=200

每次都可以正常运行,不会出现任何错误,并且在开头打印以下内容:
Content-type: text/plain (plus two newlines)

我发现根据内容长度的不同,有时候它能够工作,有时候又不能。(只有在通过Web浏览器启动程序时才会出现此问题。) 在Firefox浏览器中,使用开发者工具,我可以看到答案的Content-type。

application/octet-stream

如果我保存它,它会变成一个文本文件,其中包含应该直接在浏览器中显示的文本。

我做错了什么?

编辑:我已经搜索了类似的问题,但没有成功。

+ 所有其他功能都完美无缺。

+ 这也发生在不同的浏览器上(epiphany、lynx、Windows 上的 Internet Explorer)。


在一个位置块中设置"default_type text/plain;"。 - itpp13
感谢您的回复。 如果我按照您建议的方法(在nginx.conf中设置default_type text/plain),错误仍然存在。 但是,如果我查看下载的文档,会发现其中有不应该出现的控制字符:^Q或(iso)DC1。这可能是问题所在吗? 从nginx.conf中提取: include /etc/nginx/mime.types; #default_type application/octet-stream; default_type text/plain; 或者我需要在mime.types中添加text/plain - Cdrmoi
在/conf目录下有一个mime.types文件,你可以随意更改其中的内容。但是当你下载二进制文件时,如果设置为text/plain类型,将会显示乱码,因此你不能混用这两种类型。如果你正在构建后端,则需要在后端中设置正确的类型以便正确地传递内容。 - itpp13
好的。我已经完成了。但是似乎我的更改没有生效。 看起来nginx或fcgiwrapper(我对这些还很陌生)有时会忽略C程序打印的“Content-type:text / plain”行。 - Cdrmoi
这个有效!谢谢。 - Cdrmoi
显示剩余2条评论
1个回答

1

通过试错(使用curl + firefox-dev-tools),我发现,字符

0x11

与以下内容结合使用: Content-type: text/plain
使nginx传递Content-type: application/octet-stream

我不知道为什么会发生这种情况,但我发现C程序产生了错误,因为它打印了0x11^Qdc1。 包含此字符的文件也会出现此现象。


这是因为在发送方告诉接收方它是纯文本时,某处发送了二进制数据,导致发生了这种情况。看起来像是发送方发送了错误类型的数据。在代理/nginx的情况下,可能是nginx试图智能地检测二进制数据并相应地更改标头,但这只是一个猜测。 - itpp13
发送者是由fcgwirapper启动的程序,对吧? 此外,我在我的C程序中发现了一个错误。现在它不再发送^Q → 请求浏览器不再尝试下载输出 → 它总是text/plain,所以它可以正常工作 - Cdrmoi

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