Я только что столкнулся с этой проблемой сегодня и написал запись о ней в моем блоге : при использовании push5tete HTML5, если пользователь копирует или добавляет в закладки глубокую ссылку и снова посещает ее, тогда это будет прямой сервер хит который будет 404.
Даже библиотека push-состояния js здесь вам не поможет, так как это прямой серверный запрос, запрашиваемый до того, как страница и любой JS даже загрузятся.
Самое простое решение - добавить правило перезаписи на сервер Nginx или Apache, чтобы внутренне переписать все вызовы на одну и ту же страницу index.html. Браузер считает, что ему предоставляется уникальная страница, хотя на самом деле это та же страница:
Apache (в вашем vhost, если вы его используете):
<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 для отображения правильного контента. В моем случае я использую маршруты Backbone, которые легко справляются с этим.