Si OP o que otros todavía están buscando una manera de hacerlo modifique el historial del navegador para permitir estado, utilizando pushState y replaceState, según lo sugerido por IESUS, es la manera 'correcta' de hacerlo ahora. Su principal ventaja sobre location.hash parece ser que crea URLs reales, no sólo hashes. Si el historial del navegador usando hashes se guarda, y luego volvió a visitar sin Java, la aplicación no funcionará, ya que los valores hash no se envían al servidor. Sin embargo, si pushState se ha utilizado, toda la ruta se envía al servidor, que luego se puede construir para responder adecuadamente a las rutas. Vi un ejemplo donde se utilizaron las mismas plantillas bigote en el servidor y en el lado del cliente. Si el cliente había permitido Javascript, que obtendría respuestas ágil, evitando la ida y vuelta al servidor, pero la aplicación funcionaría perfectamente bien sin el javascript. Por lo tanto, la aplicación puede funcionar fácilmente a en ausencia de JavaScript.
Además, creo que hay algún tipo de marco por ahí, con un nombre como history.js. Para los navegadores que soportan HTML5, utiliza pushState, pero si el navegador no soporta que, cae automáticamente volver a utilizar los hashes.