如何将manifest.json的start_url设置为站点根目录?

44

我有一个 manifest.json 文件,其中有一个 start_url 属性,我希望将其指向我的单页面应用程序的第一个文件。

这个文件是 index.html,它是网站的根。我希望它成为 start_url,但该文件从未被请求为URL。

如何将 start_url 指向站点的相对根目录?

例如,如果网站位于 https://example.com,那么在 https://example.com/manifest.json 的值应该是什么?我希望PWA从 https://example.com 开始,而不是 https://example.com/index.html。PWA可能会放在另一个域上,因此 start_url 需要是相对的而不是绝对的。


2
你可以使用相对路径来设置 start_url,所以 "start_url" : "./index.html" 应该可以工作 - 或者这不是你的意思吗?另请参阅:https://developer.mozilla.org/en-US/docs/Web/Manifest#start_url。 - Tom Davies
@TomDavies 然后用户进入 https://example.com/app,但起始URL变成了 https://example.com/app/index.html 或者 https://example.com/index.html - Keith
1
不清楚为什么Tom的回复不能满足你的要求。使用"./index.html""./"(如果出于某种原因不想包含index.html)应该可以解决问题。 - Jeff Posnick
2
在这种情况下,您可以使用“./”。但我还建议使用一个 SW 缓存解决方案,该解决方案知道 ././index.html 表示相同的文档,而不是在满足导航时将它们分别处理。例如,sw-precache 将生成一个 SW,使用默认设置响应两者并使用相同的缓存 HTML 文档:https://github.com/GoogleChrome/sw-precache#directoryindex-string - Jeff Posnick
我不确定其他人是否真正清楚,但是对于start_url和/或scope使用相对URL将使其与加载清单文件的URL直接相关。根据规范,唯一的方法是使用绝对URL来设置scope和/或start_url。这会打开一系列其他情况,例如sw查看服务工作者的清单和范围。甚至可能导致返回特定响应头“service-worker-allowed”以允许其发生。 - aallord
显示剩余2条评论
6个回答

53

如果您正在站点的根目录下运行,例如https://example.com/manifest.jsonhttps://test.example.com/manifest.json,则可以使用"start_url": "/"

但是,这也会将https://example.com/test/manifest.json映射到https://example.com/,这会失败,因为它在清单范围之外的文件夹中。

相反,如果您正在使用子目录,则需要同时设置scopestart_url

"start_url": "./"
"scope": "."

这将导致https://example.com/test/manifest.json按预期映射到https://example.com/test/


在我的情况下,我使用Firebase动态链接来缩短URL。因此,example.com/app/**是动态链接。当我将start_url设置为“/”时,会出现404页面。您知道我应该如何处理这个问题,以便它也可以与动态链接一起使用吗? - Kyle Abens
1
@KyleAbens 这取决于链接是否是动态的 - 如果您使用JS重写URL,则无法在此处工作,但是如果服务器端可以,只要start_url路径相对于清单的位置即可。 - Keith
针对 @angular/pwa 用户的注释。您还需要在 ngsw-config.json 中将 "index": "/index.html" 更改为 "index": "/" - Halfist

11

3
这种方法无法在子文件夹中使用,因此https://example.com/test/会尝试(但失败)将根目录设置为https://example.com/ - Keith

1
除了将您的 start_url 更改为以下内容之外:
"start_url": "/"

或者针对子目录(有关详细信息,请参见 Keith的答案

"start_url": "./"
"scope": "."

对于在Chrome浏览器中测试manifest中的start_url更改的人,这些更改可能不会立即反映在您的PWA用户身上。根据文档

Chrome将定期比较本地安装的清单与从网络获取的清单副本进行比较。如果清单中用于将PWA添加到主屏幕的任何属性在网络副本中发生更改,则Chrome将请求更新的WebAPK,反映这些新值。

对于新版本的Chrome(76及以上),此周期为1天间隔。对于Chrome 75和早期版本,此周期为3天间隔。这是我所经历过的,并且为了强制Chrome获取新的清单(进行测试和验证目的),我已经(1)卸载了PWA,(2)清除了Chrome数据,以及(3)重新安装了PWA。


0
在Create React App中,start_url被设置为".",这似乎可以完成工作。但我还没有找到任何确认此事的文档。

0

了解页面相对于服务器的位置非常重要。对于node.js服务器,本地主机或您从哪里访问网站开始。

例如,如果我想从manifest.json运行我的网站以成为根网站,这就是我要写的内容。在此基础上,文件的根页面是index.html。

{
"start_url": "/index.html"
}

请记得添加一个连接到index.html页面的service-worker.js文件。

您可以参考文档获取更多信息:

参考资料:

  1. Web应用程序清单配方书:https://developers.google.com/web/fundamentals/web-app-manifest

  2. Service-Worker.js简介:https://developers.google.com/web/ilt/pwa/lab-scripting-the-service-worker

  3. Service-Worker.js教程:https://developers.google.com/web/ilt/pwa/lab-scripting-the-service-worker

Caleb,谢谢你,但这不是我要问的 - 我正在将外部用户引导到 example.com,然后服务器会提供一个默认页面(它是 index.html,但它也可以是 default.asp 或其他任何内容,这取决于服务)。用户在 URL 中永远看不到 example.com/index.html。现在,在 example.com/mainifest.json 中,我不想将用户引导到 example.com/index.html(特别是因为用户不会缓存它,从而破坏 PWA),我想将他们引导到 example.com - 请参见已接受的答案以了解如何实现。 - Keith
@Keith: 好的,但在收到来自 web manifest.json 文件的 start_html 的 (400) 请求后,可以考虑页面之间的路由,如 @Eric V. 在以下链接中提到的答案: { start_html = "/" } - Caleb Yang
是的,您需要确保start_url中的任何路由都返回200,如果返回400 / bad request,则您的PWA将无法正常工作。Eric V的答案不起作用,因为“start_url”:“/”将子目录路由到域根,正如我在该答案的评论中所解释的那样。是的,路径还需要在服务工作者范围内。 - Keith

-2

我甚至可以从DevTools > Application > Manifest > start_url链接到页面,切换到网络面板中的离线状态并重新加载页面,从服务工作者获取完整页面。


你好,欢迎来到SO。感谢回复,但我认为您没有理解问题。在我的Web应用程序的根目录中托管的manifest.json文件中,当它也是Web应用程序的根目录时,start_url应该设置为什么?例如,起始页面是https://example.com,那么在https://example.com/manifest.json中,start_url的值应该是什么? - Keith

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