如何让 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 上出现错误。换句话说,删除这一行:<mimeMap fileExtension=".json" mimeType="application/json" />
【参考方案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 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows iis 服务器上使用我的个人电脑在互联网上发布我的网站? [关闭]