В свои бородатые студенческие годы я читал, что JavaScript не умеет менять адрес ссылки в браузере по соображениям безопасности. Но видимо стандарты поменялись с приходом HTML5.
http://spoiledmilk.com/blog/html5-changing-the-browser-url-without-refreshing-page/
Список браузеров, поддерживающих history API:
http://caniuse.com/#search=history
Но встаёт вопрос - как поймать эвент перехода вперёд-назад в браузере? Вот решение:
