我今天刚刚遇到这个问题,并在我的博客上写了一篇关于它的文章:当使用 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 逻辑来显示正确的内容。就我而言,我正在使用可以轻松处理此问题的主干路由。