Http 为获取的文件设置MIME类型

Http 为获取的文件设置MIME类型,http,http-headers,d,vibed,Http,Http Headers,D,Vibed,我有一个静态文件服务器(用vibe.d制作)服务于一个使用ES6模块但扩展名为.mjs的网站 我的浏览器(Arch Linux上的Chromium)在获取模块文件时抛出错误服务器以非JavaScript MIME类型“application/octet stream”响应 看起来我需要将MIME类型文件的.mjs从“application/octet stream”设置为“application/javascript”。我该怎么做? 我可以将所有脚本更改为.js,但这是事实,但我更愿意找出正确的

我有一个静态文件服务器(用vibe.d制作)服务于一个使用ES6模块但扩展名为.mjs的网站

我的浏览器(Arch Linux上的Chromium)在获取模块文件时抛出错误
服务器以非JavaScript MIME类型“application/octet stream”
响应

看起来我需要将MIME类型文件的.mjs从“application/octet stream”设置为“application/javascript”。我该怎么做? 我可以将所有脚本更改为
.js
,但这是事实,但我更愿意找出正确的解决方法

如何更改正在获取的文件的MIME类型?或者更好,我可以更改所有.mjs文件的默认MIME类型吗

这是我与vibe.d的d代码:

auto router = new URLRouter;
auto fileServerSettings = new HTTPFileServerSettings;
fileServerSettings.encodingFileExtension = ["gzip" : ".gz"];
router.get("/gzip/*", serveStaticFiles("./public/", fileServerSettings));
router.get("/ws", handleWebSockets(&handleWebSocketConnection));
router.get("*", serveStaticFiles("./public/",));

listenHTTP(settings, router);

需要更改响应中的内容类型标头

Vibe.d可能有一种配置默认值的方法,但您可以在它发送编辑以
.mjs
结尾的文件头的响应之前捕获它

您可以在vibe中执行此操作。我希望这样:

auto router = new URLRouter;
auto fileServerSettings = new HTTPFileServerSettings;
fileServerSettings.encodingFileExtension = ["gzip" : ".gz"];
fileServerSettings.preWriteCallback = &handleMIME; // Add preWriteCallback to fileServerSettings
router.get("/gzip/*", serveStaticFiles("./public/", fileServerSettings));
router.get("/ws", handleWebSockets(&handleWebSocketConnection));
router.get("*", serveStaticFiles("./public/", fileServerSettings)); // Use fileServerSettings in this get too.

// preWriteCallback, will edit the header before vibe.d sends it.
void handleMIME(scope HTTPServerRequest req, scope HTTPServerResponse res, ref string physicalPath) {
    if (physicalPath.endsWith(".mjs")) {
        res.contentType = "application/javascript"; // vibe.d has an easy `.contentType` attribute so you do not have to deal with the header itself.
    }
}