我目前正在使用 angularjs 编写一个 Web 应用程序,但我认为这个问题适用于任何在客户端进行路由的客户端 javascript 框架(就像 angular 一样)。
在单页应用中,处理错误 URL 的正确方法是什么?
查看一些主要网站,我发现如果您在https://mail.google.com/mail/下方键入任何随机 URL,gmail 将重定向到收件箱。这发生在服务器端(使用 http 300 代码)或客户端,具体取决于错误路径是在 # 字符之前还是之后。另一方面,twitter 显示任何无效 URL 的真实 HTTP 404。第三个选项是显示一个“软”404,一个纯粹的客户端错误页面。
这些解决方案似乎适用于不同的情况。Twitter 希望到 twitter 用户和推文的链接是真正的链接,因此人们可以分享它们,将它们发布在新闻文章中等,因此重要的是要识别无效链接(如果我在我的网站,一个简单的抓取就会告诉我)。另一方面,在 gmail 中,您不应该将链接共享到您的收件箱中,而且我什至不确定这些链接是否真的是永久的/持久的:似乎 url 更新主要用于浏览器历史导航中的目的单页应用。第三种给出软错误的方法可能适用于类似于 gmail 的情况,但没有合理的“默认”页面。
经过这么长的介绍,这里有一些具体的问题:
- 提供“软”错误页面而不是 404 错误是否可以接受,或者如果 url 无效,单页应用程序是否应该始终重定向到真正的 404?
- Gmail 的代码可能完全没有错误,但如果它确实存在导致无效链接最终重定向回收件箱的错误,那可能比错误页面更让用户感到困惑。对于大多数 Web 应用程序,它们的测试不如 gmail 好,显示错误页面会更好吗?
- 要为单页应用程序实现真正的 404,似乎有必要在服务器端复制路由逻辑。有没有办法解决?
- 当重定向到 404 时,我认为用户应该能够看到导致错误的 URL,可能在 URL 栏中。使用 html5 history api,我认为这可以通过简单地触发当前页面的重新加载(使用错误的 url),结合上面提到的服务器端路由来完成。对于不支持此功能或使用 hashbang 表示法的浏览器,这似乎是不可能的。支持所有浏览器的最佳方式是什么?