【问题标题】:nginx + fcgiwrapper sporadic Prblem: Delivers application/octet-stream instead of text/plainnginx + fcgiwrapper 零星问题:提供 application/octet-stream 而不是 text/plain
【发布时间】:2023-03-08 09:13:01
【问题描述】:

我是这个论坛的新手。这是我的第一个问题。

我有一个 nginx-server + fcgiwrapper 设置来根据用户请求运行程序(没有 PHP)。

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

另一个用 C 编写的程序应该从标准输入读取文本,解析它并根据输入到标准输出打印文本,在请求的 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)

我发现,根据内容长度,它有时有效,有时无效。 (这只发生在程序通过网络浏览器启动时。) 在 Firefox 中,使用开发工具,我可以看到答案 Content-type 是

application/octet-stream

如果我保存它,它原来是一个文本文件,其中包含应该直接显示在浏览器中的文本。 我做错了什么?

编辑:我已经搜索过类似的问题但没有成功 +所有其他事情都完美无缺 + 这也发生在不同的浏览器上(顿悟、lynx、Windows 上的 Internet Explorer)

【问题讨论】:

  • 如果我将 C 程序更改为输出 Content-type: text/html 它可以工作。但我想要Content-type: text/plain
  • 在位置块集“default_type text/plain;”内
  • 感谢您的回复。如果我按照您的建议进行操作(在 nginx.conf 中设置 default_type text/plain),错误仍然存​​在。但是,如果我查看下载的文档,会有不应该存在的控制字符:^Q or (iso) DC1。这可能是问题吗?从 nginx.conf 中提取:include /etc/nginx/mime.types; #default_type application/octet-stream; default_type text/plain; 或者我需要在 mime.types 中添加text/plain 吗?
  • 在 /conf 中有一个 mime.types 文件你可以玩,但是当你下载一些二进制文本/纯文本会向你显示垃圾时,你不能混合和匹配,它的一个或另一个.如果您正在构建后端,那么您需要在交付内容之前在后端设置正确的类型。
  • 好的。我已经做到了。但是,我的更改似乎没有效果。似乎 nginx 或 fcgiwrapper(我对这些还是很陌生)有时只是忽略 C 程序打印的行 Content-type: text/plain

标签: http nginx content-type fastcgi plaintext


【解决方案1】:

通过反复试验(使用 curl + firefox-dev-tools)我发现,这个角色

0x11

结合: Content-type: text/plain
让nginx传递Content-type: application/octet-stream.

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

【讨论】:

  • 发生这种情况是因为在发送方告诉接收方它是纯文本时,某个地方发送了二进制文件。看起来发件人有错误发送错误的类型。在代理/nginx 的情况下,可能是 nginx 试图通过检测二进制数据并相应地更改标头来变得聪明,但那是猜测 ATM。
  • 发件人是fcgwirapper启动的程序吧?另外,我在我的 C 程序中发现了一个错误。它现在不再发送 ^Q → 请求浏览器不再尝试下载输出 → 它始终是文本/纯文本,因此可以正常工作