Это довольно старый вопрос (5 лет + на момент ответа), но многие комментарии к существующим ответам требуют обновления, основанного на «текущем» состоянии вещей.
Вот сделка:
HTML5 pushState поддерживается во всех основных браузерах. Если вы также поддерживаете более старые браузеры, history.js предоставляет отличный полифилл, который позволяет вам использовать pushState изначально и легко переключаться на устаревшие URL-адреса для старых браузеров. Теперь, когда pushState изначально поддерживается, это еще не значит, что он определенно подходит.
Существует очень важный момент, который не был затронут ни в одном из более старых ответов, а именно то, что URL-адреса хеш-функции и URL-адреса pushState отличаются не только тем, как они выглядят, но и тем, как они работают. , Это фундаментальное различие между ними может привести к тому, что вы выберете одно из другого.
pushState красивее и чище и может быть использован для полной имитации навигации по вашему сайту / в вашем приложении. Например, GitHub использует его, чтобы незаметно заменить всю навигацию. Когда вы нажимаете любую ссылку на их сайте, javascript используется для перехвата этого клика и превращения его в запрос AJAX, который обновляет содержимое страницы без загрузки новой страницы, в то время как URL-адрес в строке адреса изменяется в соответствии с содержимым, которое было неправдоподобным. Это то, что pushState предназначалось для .
В случае GitHub http://mysite/page1 и http://mysite/page2 являются действительными URL-адресами. Это «реальные» ссылки с «реальным» контентом, и первоначально посещение любой страницы проходит через традиционный подход MVC. GitHub использует pushState для навигации в современных браузерах, но не требует этого - то есть pushState используется как «добавление функции», чтобы (по их мнению) улучшить восприятие пользователем, когда дело доходит до навигации. Когда вы копируете ссылку в адресной строке браузера, вы копируете ссылку, созданную с помощью javascript & pushState, но, тем не менее, ссылку, которая является реальной и действительной.
Однако, если вы начинаете с нуля и создаете одностраничное приложение и не используете инфраструктуру MVC, есть вероятность, что у вас фактически есть только одна страница, особенно если вы не используете динамический бэкэнд (т. Е. Все содержимое извлекается с помощью JavaScript, никогда не генерируется сервером). В этом случае, если вы используете pushState поверх хеш-URL, вам нужно будет обработать случай, когда URL в браузере не является реальным URL. Я проиллюстрирую.
Пользователь загружает ваше одностраничное приложение: http://mysite/mainpage
На этом этапе панель браузера содержит реальную ссылку на ваше приложение и приведет пользователя к тому же представлению, которое они в данный момент видят: главной странице. Теперь они нажимают на ссылку, которая приведет их на «страницу», показывающую детали некоторых действий. На данный момент вы хотите обновить адресную строку, чтобы указать изменение в состоянии. Вы либо используете хеш-URL, и ваша строка местоположения выглядит как http://mysite/mainpage#charts/1, либо вы используете pushState и обманывает его, чтобы он стал http://mysite/mainpage/charts/1
Если вы использовали pushState, это не настоящая ссылка . Навигация с помощью кнопок браузера «назад» / «вперед» будет работать отлично, и пользователь перейдет с главной страницы на страницу сведений как в строке местоположения, так и в приложении (при условии, что вы правильно обрабатываете изменение состояния), но если пользователь добавит в закладки эту ссылку или скопируйте и вставьте ссылку, чтобы поделиться ею, потребуется дополнительное серверное вуду.
Вам нужно будет перенаправить запросы на / mainpage / charts / 1 на / mainpage, а затем использовать JS для разрешения фактического URL-адреса и выполнения предполагаемой операции изменения состояния. Перенаправление сервера абсолютно необходимо. Эту страницу нельзя разместить на AWS или на локальном диске без http-сервера с поддержкой сценариев.
Теперь, если бы вы использовали хеш-URL, ваш URL, который бы пользователь видел и взаимодействовал, был бы http://mysite/mainpage#/charts/1 , и это действительный, реальный URL .Браузеры понимают, что есть только одна страница, и независимо от того, копирует ли пользователь и вставляет ли ссылку или делает закладку на нее, вам просто нужно обработать хеш-состояние в javascript и не нужно никакого волшебства на стороне сервера, чтобы все заработало.
То, что никто не упоминает, это то, что pushState и хеш-ссылки не являются взаимоисключающими .pushState - это просто API для управления местоположением браузера, видимым для пользователя , и реализации надежной навигации назад / вперед в современных браузерах.В нем ничего не говорится о том, как должна выглядеть ваша схема URL.
В 2017 году Google и почти любой другой бот, поддерживающий JS, понимают хэш-URL-адреса и обходят их очень хорошо.Google хочет, чтобы вы использовали #!мерзость для целей максимизации SEO, но даже если вы этого не сделаете, ваш сайт будет хорошо ориентироваться.
Правильный ответ - использовать то, что лучше всего соответствует вашим потребностям.Если у вас есть реальные URL-адреса и вы хотите имитировать навигацию между ними, используйте pushState и продолжайте (опционально с полифилом для старых браузеров).Но если у вас есть одностраничное приложение, не делайте вид, что нет (если у вас нет веских причин).Используйте URL-адреса хешей, чтобы упростить свою жизнь, и не создавайте ненужных проблем , а затем используйте pushState для управления этими URL-адресами хэш-функций, чтобы воспользоваться преимуществами лучшей поддержки перемотки назад / вперед .