在 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 禁用目录列表的好方法