如何让 IIS 在我的网站上正确提供 .webmanifest 文件?

Posted

技术标签:

【中文标题】如何让 IIS 在我的网站上正确提供 .webmanifest 文件?【英文标题】:How Can I have IIS properly serve .webmanifest files on my web site? 【发布时间】:2018-09-09 00:34:42 【问题描述】:

Favicon Generator 组装了一个供网站管理员使用的软件包,以便为许多不同的设备提供可用的图标。该页面带有一个名为site.manifest 的文件,该文件通过网页文档<head> 中的以下标记链接到:

<link rel="manifest" href="site.webmanifest">

根据Mozilla:“Web 应用程序清单在 JSON 文本文件中提供有关应用程序的信息(例如名称、作者、图标和描述)。清单的目的是安装 Web 应用程序到设备的主屏幕,为用户提供更快的访问和更丰富的体验。”

很遗憾,如果您使用的是 Microsoft 的 Internet 信息服务 (IIS),如果您尝试访问 site.webmanifest 文件,则会收到 404.3 错误。

确切的错误消息如下:“由于扩展​​配置,无法提供您请求的页面。如果页面是脚本,请添加处理程序。如果应该下载文件,请添加 MIME地图。”

如何在 IIS 中正确地提供 site.webmanifest 文件?

【问题讨论】:

【参考方案1】:

默认情况下,IIS 不提供在其 (IIS) 核心设置中没有与之关联的 MIME 映射的任何文件。

要应对这一挑战,您需要将 .webmanifest 文件扩展名映射到其适当的 MIME 类型。

为此,请打开 IIS 并按照以下步骤操作;

    在左侧,在“连接”菜单中选择您的网站或整个服务器。 如果您选择服务器,您的 MIME 映射将应用于服务器上的每个网站。 如果您选择一个网站,它将仅适用于单个网站。

    接下来,从 IIS 菜单中选择“MIME 类型”:

    在那里,点击右侧菜单中的“添加...”。

    在打开的对话框中,在 MIME 类型框中的文件扩展名框中指定 .webmanifest application/manifest+json

    点击“确定”。

恭喜;您刚刚在 IIS 上为 .webmanifest 定义了 MIME 类型。

【讨论】:

...有关.webmanifest文件扩展名MIME type可用here的更多详细信息 我这样做了,它破坏了该服务器上所有站点上的所有.js 文件(出于某种原因,服务器开始将它们作为html 而不是text/javascript 提供服务)。为什么会发生这种情况?在 IIS 中删除 .webmanifest mime 类型后,网站恢复正常。 有趣的是,我像解释的那样添加它,但它很快就消失了,我又得到一个 403,再次添加它,工作一段时间然后它又消失了,等等。 为这个问题道歉,但我已经定义了 .manifest,默认情况下我假设为application/x-ms/manifest。我可以改变这个定义吗?请注意,如果我确实更改它,它仍然会给出 OP 发布的错误 @nathanjw,此主题适用于 .webmanifest 文件。 .manifest.webmanifest 不一样。希望这可以帮助。 :)【参考方案2】:

对于 Azure,我将其添加为 web.config

<?xml version="1.0"?>

<configuration>
    <system.webServer>
        <staticContent>
            <mimeMap fileExtension=".json" mimeType="application/json" />
            <mimeMap fileExtension=".webmanifest" mimeType="application/manifest+json" />
        </staticContent>
    </system.webServer>
</configuration> 

【讨论】:

谢谢!这也修复了使用 IIS Express 进行的调试。 这是更好的答案,因为我无权在服务器上设置 mime 类型。 非常感谢,我为此苦思了两天多。在此之后,它真的很顺利地解决了我的两个问题:离线缓存和安装网络应用程序功能。 如果 json 已经是有效的 mime 类型,请删除 json 映射以防止 IIS 上出现错误。换句话说,删除这一行:&lt;mimeMap fileExtension=".json" mimeType="application/json" /&gt;【参考方案3】:

对于那些使用 ASP.NET Core(我使用的是 2.1)的用户,您可以根据 static files 文档配置可在应用程序 Startup.cs 文件中提供的 MIME 类型:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    FileExtensionContentTypeProvider provider = new FileExtensionContentTypeProvider();
    provider.Mappings[".webmanifest"] = "application/manifest+json";

    app.UseStaticFiles(new StaticFileOptions()
    
        ContentTypeProvider = provider
    );

    app.UseMvc();

【讨论】:

+1 这也适用于 Kestrel,即不在 IIS 上运行项目,但在 launchSetting.json 中使用本地配置文件时 如果您已经通过 app.UseStaticFiles() 使用静态文件,请确保调用 both UseStaticFiles() 和 UseStaticFiles(new StaticFileOptions()...) 否则您的所有其他文件都将停止提供服务。 请注意,需要手动添加到 .NET core 3.1。在 .NET Core 5.0 中,它已包含在默认提供程序映射中,尝试手动添加它会导致异常,因为它已经存在。【参考方案4】:

更简单的解决方案是将清单文件重命名为 site.webmanifest.json 并链接为

 <link rel="manifest" href="site.webmanifest.json">

IIS 应该已经有 .json 文件的 MIME 类型 如果部署到不容易更改 IIS 设置的 Azure,这也很有帮助。

【讨论】:

我同意将文件重命名为 *.json 最初对我来说是最有意义的。特别是因为该文件确实是 JSON 数据。但是,在我的问题起源的以下线程中有一些强烈反对这样做:github.com/RealFaviconGenerator/realfavicongenerator/issues/372 根据当前的 W3C 工作草案,这些文件必须命名为 .webmanifest。是的,目前浏览器正在使用 .json,但他们可以根据规范随意更改它,然后它会破坏你的 PWA。【参考方案5】:

添加到@Ben 的answer:如果您有 SPA,您应该将 StaticFileOptions 代码放入 UseSpaStaticFiles() 调用中:

FileExtensionContentTypeProvider provider = new FileExtensionContentTypeProvider();
provider.Mappings[".webmanifest"] = "application/manifest+json";

app.UseSpaStaticFiles(new StaticFileOptions()

    ContentTypeProvider = provider
);

【讨论】:

【参考方案6】:

我发现 IIS 服务器在请求过滤功能中列出了“.json”,表明它是不允许的。

删除允许提供文件的文件。

【讨论】:

以上是关于如何让 IIS 在我的网站上正确提供 .webmanifest 文件?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 用VS2005创建的网站如何让其他人浏览

无法让 IIS 从指定目录提供 .js 文件

如何在 Windows iis 服务器上使用我的个人电脑在互联网上发布我的网站? [关闭]

如何使用 PowerShell 在 IIS 中停止和启动各个网站?

使用 IIS Express 托管网站(临时)

如何让应用程序在测试设备上运行