CanJS has a plugin, can/route/pushstate, which performs routing based on the entire URL instead of just the hash -- and it uses window.history.pushstate to update the URL when you change routes in your app, as well.
There are a few issues and caveats with it, like needing to do some server-side work so that those URLs are handled appropriately, and possibly some issues with the back button triggering new history, but overall I believe it does exactly what you're looking for.
There are a few issues and caveats with it, like needing to do some server-side work so that those URLs are handled appropriately, and possibly some issues with the back button triggering new history, but overall I believe it does exactly what you're looking for.