Tenía la impresión de que Angular reescribiría las URL que aparecen en los atributos href de las etiquetas de anclaje dentro de las plantillas, de modo que funcionen ya sea en modo html5 o en modo hashbang. La documentación para el servicio de ubicación parece decir que HTML Link Rewriting se ocupa de la situación de hashbang. Por lo tanto, esperaría que cuando no esté en modo HTML5, se insertarán hashes, y en modo HTML5, no.
Sin embargo, parece que no se está reescribiendo. El siguiente ejemplo no me permite simplemente cambiar el modo. Todos los enlaces en la aplicación tendrían que reescribirse a mano (o derivarse de una variable en tiempo de ejecución. ¿Debo reescribir manualmente todas las URL dependiendo del modo?
No veo ninguna reescritura de URL del lado del cliente en Angular 1.0.6, 1.1.4 o 1.1.3. Parece que todos los valores href deben anteponerse con # / para el modo hashbang y / para el modo html5.
¿Hay alguna configuración necesaria para reescribir? ¿Estoy leyendo mal los documentos? ¿Haciendo algo más tonto?
Aquí hay un pequeño ejemplo:
<head>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.3/angular.js"></script>
</head>
<body>
<div ng-view></div>
<script>
angular.module('sample', [])
.config(
['$routeProvider', '$locationProvider',
function ($routeProvider, $locationProvider) {
//commenting out this line (switching to hashbang mode) breaks the app
//-- unless # is added to the templates
$locationProvider.html5Mode(true);
$routeProvider.when('/', {
template: 'this is home. go to <a href="https://stackoverflow.com/about"/>about</a>'
});
$routeProvider.when('/about', {
template: 'this is about. go to <a href="https://stackoverflow.com/"/>home</a'
});
}
])
.run();
</script>
</body>
Anexo: al releer mi pregunta, veo que utilicé el término "reescribir" sin una gran claridad sobre quién y cuándo quería reescribir. La pregunta es acerca de cómo hacer que Angular reescriba las URL cuando renderiza rutas y cómo hacer que interprete rutas en el código JS de manera uniforme en los dos modos. No se trata de cómo hacer que un servidor web realice una reescritura de solicitudes compatible con HTML5.
fuente
Respuestas:
La documentación no es muy clara sobre el enrutamiento AngularJS. Habla sobre Hashbang y modo HTML5. De hecho, el enrutamiento AngularJS opera en tres modos:
Para cada modo hay una clase de LocationUrl respectiva (LocationHashbangUrl, LocationUrl y LocationHashbangInHTML5Url).
Para simular la reescritura de URL, debe establecer html5mode en verdadero y decorar la clase $ sniffer de la siguiente manera:
Ahora explicaré esto con más detalle:
Modo hashbang
Configuración:
Este es el caso cuando necesita usar URL con hashes en sus archivos HTML, como en
En el navegador debe usar el siguiente enlace:
http://www.example.com/base/index.html#!/base/path
Como puede ver en modo Hashbang puro, todos los enlaces en los archivos HTML deben comenzar con la base como "index.html #!".
Modo HTML5
Configuración:
Debe establecer la base en el archivo HTML
En este modo, puede usar enlaces sin el # en archivos HTML
Enlace en el navegador:
Hashbang en modo HTML5
Este modo se activa cuando realmente utilizamos el modo HTML5 pero en un navegador incompatible. Podemos simular este modo en un navegador compatible decorando el servicio $ sniffer y configurando el historial como falso.
Configuración:
Establecer la base en el archivo HTML:
En este caso, los enlaces también se pueden escribir sin el hash en el archivo HTML
Enlace en el navegador:
fuente
$provide
es indefinido?Para futuros lectores, si está utilizando Angular 1.6 , también debe cambiar el
hashPrefix
:No olvides establecer la base en tu HTML
<head>
:Más información sobre el registro de cambios here.
fuente
Esto me llevó un tiempo comprender, así es como lo puse a trabajar: enrutamiento ASP angular WebAPI sin el # para SEO
Añadir $ locationProvider.html5Mode (verdadero); a app.config
Necesitaba que se ignorara cierto controlador (que estaba en el controlador de inicio) para cargar imágenes, así que agregué esa regla a RouteConfig
En Global.asax, agregue lo siguiente: asegúrese de ignorar las rutas de carga de la API y la imagen para que funcionen normalmente, de lo contrario redirigirán todo lo demás.
Asegúrese de usar $ location.url ('/ XXX') y no window.location ... para redirigir
Hacer referencia a los archivos CSS con ruta absoluta
y no
Nota final: hacerlo de esta manera me dio el control total y no tuve que hacer nada en la configuración web.
Espero que esto ayude, ya que me llevó un tiempo entenderlo.
fuente
Quería poder acceder a mi aplicación con el modo HTML5 y un token fijo y luego cambiar al método hashbang (para mantener el token para que el usuario pueda actualizar su página).
URL para acceder a mi aplicación:
http://myapp.com/amazing_url?token=super_token
Luego, cuando el usuario carga la página:
http://myapp.com/amazing_url?token=super_token#/amazing_url
Luego, cuando el usuario navega:
http://myapp.com/amazing_url?token=super_token#/another_url
Con esto mantengo el token en la URL y mantengo el estado cuando el usuario está navegando. Perdí un poco de visibilidad de la URL, pero no hay una manera perfecta de hacerlo.
Por lo tanto, no habilite el modo HTML5 y luego agregue este controlador:
fuente