Quizás todas las demás respuestas sean para 2.X angular.
Ahora no funciona para angular 5.X. Estoy trabajando con eso.
solo con NavigationEnd, no puede obtener la URL anterior.
porque el enrutador funciona desde "NavigationStart", "RoutesRecognized", ..., hasta "NavigationEnd".
Puedes consultar con
router.events.forEach((event) => {
console.log(event);
});
Pero aún no puede obtener la URL anterior incluso con "NavigationStart".
Ahora necesitas usar por pares.
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/pairwise';
constructor(private router: Router) {
this.router.events
.filter(e => e instanceof RoutesRecognized)
.pairwise()
.subscribe((event: any[]) => {
console.log(event[0].urlAfterRedirects);
});
}
Con pares, puede ver de qué URL es y hacia.
"RoutesRecognized" es el paso de cambio de la URL de origen a la de destino.
así que fíltralo y obtén la URL anterior.
Por último, si bien no menos importante,
poner este código en el componente principal o superior (por ejemplo, app.component.ts)
porque este código se activa después de terminar el enrutamiento.
Actualizar angular 6+
El events.filter
da error porque el filtro no es parte de los eventos, así que cambie el código a
import { filter, pairwise } from 'rxjs/operators';
this.router.events
.pipe(filter((evt: any) => evt instanceof RoutesRecognized), pairwise())
.subscribe((events: RoutesRecognized[]) => {
console.log('previous url', events[0].urlAfterRedirects);
console.log('current url', events[1].urlAfterRedirects);
});