修复欺骗性 404 错误

单页应用无需加载新页面即可显示不同的内容。为此,它们会对链接和 History API 使用点击处理程序。History API 可用于操控浏览器会话历史记录。这样一来,我们就可以在显示其他页面(在单页应用中通常称为“视图”)时更新网址。它还可以确保浏览器的返回按钮仍可按预期运行。

查看此 Codelab 中的单页应用。它会显示猫或狗的图片,并提供在这两种动物之间切换的链接。似乎工作正常!

揭秘欺骗性 404

很遗憾,该应用中存在一个细微 bug。我们来看一下!

  • 如需预览网站,请按查看应用,然后按全屏 全屏
  • 点击 Doggos 链接。请注意网址的变化情况。
  • 重新加载应用。

您打开的网页显示“Cannot GET /doggos”- 欺骗性 404。它具有“欺骗性”,因为只要您仅点击其中的链接,Web 应用似乎就能正常工作。在新浏览器窗口中使用网址或刷新页面时,该网址会中断。问题在于,服务器不知道如何响应对这些网址的请求。我们的 Web 应用中的 JavaScript 代码使用 History API 在这些网址之间导航,但服务器不知道如何处理这些网址。只要服务器不知道如何处理所请求的网址,它就会以 HTTP 状态代码 404 进行响应。使用此代码,服务器表示没有找到所请求网址的任何内容。

在这种情况下,搜索引擎不会将网址编入索引,因为用户点击搜索结果后会找到错误消息,但不会看到他们所寻找的内容(例如狗狗照片)。

修复服务器

此项目使用以 JavaScript 编写的 express.js 服务器。我们来修复服务器,使其以 index.html 作为响应,然后单页应用将处理其余工作。

  • 点击 Remix to Edit 使项目可修改。
  • 选择 server.js 文件。

此文件包含服务器代码。它会设置 express.js 服务器并发送 index.html 的内容。第 15 行中的路由设置仅在请求转到网址 / 时传送 Web 应用。服务器还应提供我们创建的其他网址。让我们更改该网址以提供所有网址,这样它将来也支持其他网址。

为此,我们可以将第 15 行开始的代码更改为以下代码:

app.get('/*', function(request, response) {
  response.sendFile(__dirname + '/views/index.html');
});

/* 与任何网址匹配,现在服务器会针对任何给定网址使用 index.html 中的 Web 应用进行响应。

  • 如需预览网站,请按查看应用,然后按全屏 全屏

现在,您应该可以在新的无痕式窗口中刷新和打开链接了。