英文:
Golang fileserver setting content-type differently on linux and macos
问题
我正在使用http.FileServer
在我的Web服务中,当我尝试从中提供一个JavaScript文件时,在Linux(debian 11)上会得到一个text/javascript; charset=utf-8
的内容类型头,但在MacOS 13上是application/javascript
。
Linux上的Go版本是1.19.1
,而MacOS上是1.19.3
。在这两台机器上,我在Web服务运行的环境中设置了LANG=en_GB.UTF-8
。
有趣的是,当提供其他文本文件时,例如HTML文件,我会在**MacOS和Linux上都得到text/html; charset=utf-8
。
这是什么原因呢?这导致我的单元测试在MacOS上失败,我更希望测试完整的内容类型,包括字符集。
英文:
I am using the http.FileServer
in my web service, and when I try serving a javascript file from it, I will get a content-type header of text/javascript; charset=utf-8
on Linux (debian 11), but application/javascript
on MacOS 13.
Go version is 1.19.1
on linux, and 1.19.3
on MacOS. On both machines I set LANG=en_GB.UTF-8
in the environment the web service runs in.
Interestingly, when serving other text files, e.g. a HTML file, I will get text/html; charset=utf-8
on both MacOS and Linux.
What is the reason for this? It makes my unit tests fail on MacOS, and I would prefer to test for the full content-type including character set.
答案1
得分: 1
http.FileServer
使用文件名的扩展名来确定Content-Type
,如果未设置的话。这个过程中会调用mime.TypeByExtension()
方法。
mime.TypeByExtension()
的文档说明称,系统的MIME.info数据库会增加映射关系。这些数据库在Linux和MacOS之间可能是不同的。
@Andrei Vasilev指出,你可以使用AddExtensionType()
来覆盖默认的MIME类型。
另外,你可以更新相应的本地mime.types
文件,使其返回相同的类型。在我的MacOS 12.6.1上,使用go1.19.1 darwin/arm64,我安装了Apache,执行以下代码的返回值为:
mime.TypeByExtension(".js")
来自于/etc/apache2/mime.types
文件。
英文:
http.FileServer
uses the filename's extension to determine the Content-Type
if it's not set. That in turn calls mime.TypeByExtension()
.
The documentation for mime.TypeByExtension()
says that the mapping is augmented by the system's MIME.info database. Those are likely different between Linux and MacOS.
@Andrei Vasilev notes that you can override the default mime types with AddExtensionType()
.
Alternatively, you could update the appropriate local mime.types
file to make them return the same type. On my MacOS 12.6.1 with go1.19.1 darwin/arm64, I have apache installed and the return value of:
mime.TypeByExtension(".js")
is from /etc/apache2/mime.types
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论