4

在今天早些时候看到另一篇关于 HTML5 History API 的帖子并阅读了Mozilla的教程之后,我已经能够实现一个基本的工作演示,使用这个 API 来允许 URL “重写”,而无需重新加载页面并且不使用哈希。

我的问题是:假设您有一个用户来到一个页面,点击其中一个使用历史 API 编写新 URL 的链接。然后用户为页面添加书签。现在我假设它现在会将重写的 URL 加入书签。因此,当用户在几天后回来并尝试转到已添加书签的页面时,它不会返回 404 吗?那么你如何实现一种方法来解决它呢?

这是假设我重写的 URL 指向一个不存在的位置。

4

3 回答 3

2

我知道这很旧,但是您完全滥用了 pushstate。假设您有一个查看艺术家的页面,我们将其命名为 Artists.php。如果他们点击一个,他们可以看到艺术家的简历。所以你有“另一个”页面,artist.php?artist=journey

现在,假设您决定在模式窗口中异步加载 bio,因此您添加一个 ajax 触发器来禁用布局并获取内容 (artists.php?artist=journey&ajax=true)。您可以“推送”artist.php?artist=journey 到历史记录,并使其在加载该页面时加载您的艺术家页面,并在模态窗口中预加载旅程。

这样,您就可以使用它来为页面的不同状态添加书签 - 而不仅仅是在点击某处时拥有漂亮的 URL。

于 2012-09-14T18:42:56.530 回答
1

我今天刚刚遇到这个问题,并在我的博客上写了一篇关于它的文章:当使用 HTML5 推送状态时,如果用户复制或收藏一个深度链接并再次访问它,那么这将是一个直接的服务器命中,即 404。

即使是 js pushstate 库也无济于事,因为这是在页面和任何 JS 甚至加载之前请求的直接服务器调用。

最简单的解决方案是向 Nginx 或 Apache 服务器添加重写规则,以在内部重写对同一 index.html 页面的所有调用。当实际上是同一页面时,浏览器认为它正在被提供一个独特的页面:

Apache(如果您使用的是虚拟主机,则在您的虚拟主机中):

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.html$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.html [L]
 </IfModule>

Nginx

rewrite ^(.+)$ /index.html last;

当然,您仍然需要添加一些 JS 逻辑来显示正确的内容。就我而言,我正在使用可以轻松处理此问题的主干路由。

于 2012-05-18T06:10:28.450 回答
0

这应该由服务器端脚本完成。服务器应该解析 URL 并创建页面。

于 2011-03-31T18:37:50.213 回答