在 golang HTTP FileServer 的 Content-Type 标头上设置 'charset' 属性

Posted

技术标签:

【中文标题】在 golang HTTP FileServer 的 Content-Type 标头上设置 \'charset\' 属性【英文标题】:Setting the 'charset' property on the Content-Type header in the golang HTTP FileServer在 golang HTTP FileServer 的 Content-Type 标头上设置 'charset' 属性 【发布时间】:2015-11-24 21:51:09 【问题描述】:

我在测试 golang 网络应用时遇到了问题。在已部署的版本中,nginx 位于应用程序前面并显式设置charset utf8;,以便所有文本内容类型都附加一个字符集声明。

在测试中,我直接打了 golang 应用程序,这里的内容类型没有字符集集。这在尝试为 d3 之类的库提供服务时会导致问题,其中包含以下行:

var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;

因为 golang 没有指定字符集,所以这些在 chrome 中呈现为:

var ε = 1e-6, ε2 = ε * ε....

让 golang http 服务器在 HTTP 标头上输出 charset=utf8 声明的最佳方法是什么?

【问题讨论】:

我假设您的意思是 Go HTTP 服务器,而不是 Chrome?只需 w.Header().Set("Content-Type", "text/html; charset=utf-8")(如果这是内容类型)在相关处理程序中,和/或在中间件中将其应用于多个处理程序。 Erk,修正了错字。我正在使用文件服务器来提供不同文件和 mimetypes 的目录,因此手动设置它可能不会真正起作用,除非我重新实现现有的内容类型嗅探。 【参考方案1】:

FileServer 调用mime.TypeByExtension 来获取内容类型。如果没有为扩展注册类型,则 FileServer 调用http.DetectContentType 从文件内容中猜测类型。

如果 text/ 内容类型未指定 charset 参数,则 mime 包会自动将 'charset=utf-8' 参数添加到内容类型。

要调试此问题,请检查系统 mime.types 文件是否为文件扩展名指定了内容类型,以及 charset 参数是否为 'charset=utf-8' 或未设置 charset 参数。

如果系统 mime.types 条目丢失或不正确,则调用 mime.AddExtensionType 覆盖系统设置。这可以在提供任何内容之前调用一次。

【讨论】:

我尝试将mime.AddExtensionType(".js","application/javascript; charset=utf8") 作为main() 的第一行,但没有任何区别。此外,当我在 OSX 上进行测试时,在 linux 上进行相同的测试导致 js 文件被用作 application/javascript 而没有 charset 参数。 edit 这个程序似乎仍然在 Mac 上以 application/javascript 的身份提供 javascript:play.golang.org/p/AIWPjrOGOt 好吧,这很奇怪——它现在也适用于我。我想我遇到了 chrome 缓存问题。

以上是关于在 golang HTTP FileServer 的 Content-Type 标头上设置 'charset' 属性的主要内容,如果未能解决你的问题,请参考以下文章

在 golang HTTP FileServer 的 Content-Type 标头上设置 'charset' 属性

戈朗。用啥? http.ServeFile(..) 还是 http.FileServer(..)?

在 Go 中使用 http.FileServer 禁用目录列表的好方法

使用 gorilla mux 提供 HTML

Apache ActiveMQ Fileserver远程代码执行漏洞

goweb-处理静态资源