HTML5 история pushState ссылка назад - PullRequest
4 голосов
/ 13 февраля 2011

Сегодня, увидев еще один пост ранее по API истории HTML5 и прочитав учебник по Mozilla , я смог реализовать базовую рабочую демонстрацию для использования этого API, чтобы разрешить переписывание URL без перезагрузки страницы и без использования хэша.

Мой вопрос: Допустим, у вас есть пользователь, который заходит на страницу и нажимает на одну из этих ссылок, которая использует API истории для написания нового URL. Затем пользователь закладывает страницу в закладки. Теперь я предполагаю, что теперь он добавит в закладки переписанный URL. Поэтому, когда пользователь возвращается через пару дней или что-то в этом роде и пытается перейти на страницу с закладками, он не вернет 404? И так, как вы можете реализовать способ его решения как-то?

Предполагается, что переписываемый URL указывает на несуществующее местоположение.

Ответы [ 3 ]

1 голос
/ 18 мая 2012

Я только что столкнулся с этой проблемой сегодня и написал запись о ней в моем блоге : при использовании 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, которые легко справляются с этим.

1 голос
/ 14 сентября 2012

Я знаю, что это старо, но вы совершенно неправильно используете pushstate. Допустим, у вас есть страница для просмотра артистов, давайте назовем ее художниками. И если они нажимают на один, они могут увидеть биографию художников. Итак, у вас есть «другая» страница, artist.php? Artist = путешествие

Теперь, скажем, вы решили, что вы будете загружать био в асинхронном режиме в модальном окне, поэтому вы добавляете триггер ajax, чтобы отключить макет и просто получить содержимое (artistic.php? Artist = travel & ajax = true). Вы можете «нажать» artist.php? Artist = путешествие в историю и сделать так, чтобы, если эта страница была загружена, она загружала страницу ваших художников с путешествием, предварительно загруженным в модальное окно.

Таким образом, вы можете использовать его, чтобы сделать возможным создание закладок в разных состояниях вашей страницы, а не просто иметь красивые URL, когда они кликают куда-то.

0 голосов
/ 31 марта 2011

Это должно быть сделано серверными сценариями. Сервер должен разобрать URL и сделать страницу.

...