这个问题涉及在不实际导航到该 URL 的情况下更改浏览器中的 URL。我也偶然发现了几个使用它的网站,我发现它对用户造成混淆/误导,我想知道为什么首先允许这样做。
问题:为什么允许代理/浏览器更改 URL 而无需实际导航到该路径?允许这样做的好处是什么,而缺点是让用户感到困惑。
这个问题涉及在不实际导航到该 URL 的情况下更改浏览器中的 URL。我也偶然发现了几个使用它的网站,我发现它对用户造成混淆/误导,我想知道为什么首先允许这样做。
问题:为什么允许代理/浏览器更改 URL 而无需实际导航到该路径?允许这样做的好处是什么,而缺点是让用户感到困惑。
长期以来,网络应用程序仅使用 JavaScript 就能够完全改变页面的内容。例如,在 Twitter 中,您可以完全在客户端从主时间轴导航到配置文件再到特定推文,无需重新加载任何页面——仅基于 JavaScript 的更新。
这样做的问题是,您无法复制、添加书签或共享您看似所在的 URL。如果您从 开始
https://twitter.com
并打开例如推文或个人资料页面,您的地址栏仍然认为您在https://twitter.com
。你也不能真的点击“后退”按钮——你会离开整个应用程序。许多网站试图通过仅更改
#hash
URL 的一部分(用于内部页面链接)来解决此问题,通常以使其看起来类似于真实路径的方式 - 例如单击@stackoverflow 将其更改为https://twitter.com/#!/stackoverflow
.现在该 URL 是可复制和可收藏的,但仍然存在问题——它只能被客户端 JS 理解,而不被禁用/阻止 JS 的搜索引擎或浏览器甚至 wget/curl 等 HTTP 工具理解。对于所有这些工具和程序,# 之后的部分是没有意义的(因为它指向动态 JS 生成的数据,而不是 real name= 或 id=)。
这就是为什么添加 API 以通过 JS 生成“真实”历史事件的原因——它允许每个基于 JS 的页面都有一个 URL 与真实的基于服务器的页面完全对应。当您单击个人资料链接时,JS 会生成您在没有 JS 时获得的相同页面(只是速度更快),因此它也具有相同的 URL。
如果你使用这个 API,你当然应该只生成实际存在于服务器上并对应于真实 URL 的路径——就像在上面的例子中,当 JavaScript 将 URL 更改为 时
https://twitter.com/stackoverflow
,这很好,因为这是一个真实的页面以后可以访问,内容相同。只是碰巧页面是通过 JS 而不是通过导航加载的,但这种差异应该是几乎看不见的。因此,只有当 API 被滥用时, “缺点是让用户感到困惑”才是正确的,例如生成服务器稍后无法识别的 URL。