设置获取文件的MIME类型

3

我有一个使用vibe.d创建的静态文件服务器,它提供了一个使用.mjs扩展名的ES6模块的网站。

当我的浏览器(Arch Linux上的Chromium)获取模块文件时,它会抛出一个错误:server responded with a non-JavaScript MIME type of "application/octet-stream"

看起来我需要将带有.mjs的文件的MIME类型从“application/octet-stream”更改为“application/javascript”。我该怎么做呢?我可以将所有脚本更改为.js,但我更想弄清楚如何正确解决这个问题。

我应该如何更改正在获取的文件的MIME类型?或者更好的方法是,我能否更改所有.mjs文件的默认MIME类型?

以下是我的d代码与vibe.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);
1个回答

1
响应中的内容类型头需要更改。
Vibe.d 可能有一种配置默认值的方法,但您始终可以在发送响应之前捕获它以编辑以 .mjs 结尾的文件的标头。
您可以在 Vibe.d 中这样做:
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.
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接