Clean URLs en AngularJS

Por defecto las rutas que tenemos en AngularJS suelen incluir un hash “#”. Podemos tener rutas del estilo /#/registro. Que en realidad estará llamando a nuestro index.html e indicando que queremos cargar nuesto contenido enrutado por /registro.
Podemos conseguir url de aspecto más limpio activando el modo html5 del $locationProvider. Así conseguiremos rutas cómo /registro. Aún así realmente la petición se hace a index.html, claro.
¿Pero que pasa si accedemos desde el navegador a esa ruta directamente? Que nos dará un 404 porque el servidor ya no cargará index.html y la petición queda fuera del ambito de AngularJS. Podemos solucionarlo incluyendo en el .htaccess unas reglas para modRewrite que hagan pasar todas las peticiones, menos a ficheros y directorios, por el index.html.


RewriteEngine on

# Don't rewrite files or directories
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# Rewrite everything else to index.html to allow html5 state links
RewriteRule ^ index.html [L]