angularjs - ¿Cómo puedo lanzar un 404 o 301 real con una URL de estado de inserción angular?
seo http-status-code-404 (3)
De acuerdo con esta respuesta, ¿cómo manejan los motores de búsqueda las aplicaciones de AngularJS? , Debe usar el Navegador sin cabeza para procesar solicitudes de rastreadores y devolver instantáneas de la página con el Código de respuesta apropiado. https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot
El ejemplo de google no incluyó 301,302 o 404 casos. Sin embargo, su código podría modificarse para analizar el contenido de la instantánea y cambiar el código de respuesta.
Encontré que prerender.io ofrece este servicio, pero no es gratis. Sin embargo, tienen un plan gratuito si tienes menos de 250 páginas. Prerender solicita que en el caso de 404 o 301, agregue una etiqueta meta al DOM.
<meta name="prerender-status-code" content="404">
esta metaetiqueta es detectada por su navegador sin cabeza y se cambia el código de respuesta.
Estoy usando $ routeProvider y $ locationProvider para manejar las URLS de pushstate en una aplicación de una sola página (SPA), algo como esto:
angular.module(''pets'', [])
.config(function($routeProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$routeProvider.when(''/pet/:petId'', {
controller: ''petController''
});
})
.controller(''petController'', function($scope, petService, $routeParams){
petService.get(''/api/pets/'' + $routeParams.petId).success(function(data) {
$scope.pet = data;
});
});
La URL se utiliza para extraer contenido del servidor que puede o no existir.
Si se tratara de un sitio web normal de varias páginas, una solicitud de contenido faltante provocaría una respuesta 404 del encabezado del servidor, y una solicitud de contenido movido activaría un 301. Esto alertaría a Google sobre el contenido perdido o movido.
Digamos, por ejemplo, que llego a una URL como esta:
http://example.com/pet/123456
y diga que no hay tal mascota en la base de datos, ¿cómo puede mi SPA devolver un 404 en ese contenido?
Si esto falla, ¿hay alguna otra forma de alertar correctamente al usuario o al motor de búsqueda de que la URL solicitada no existe? ¿Hay alguna otra solución que no esté considerando?
La verdadera pregunta es: ¿ http://example.com/pet/123456
devuelve algo?
Si su punto de partida es http://example.com/
y hay un enlace a http://example.com/pet/123456
, Angular llamará a petController
que a su vez realiza una llamada AJAX a http://example.com/api/pet/123456
.
Un rastreador no haría eso, sino que intentaría llamar directamente a http://example.com/pet/123456
.
Así que su servidor debe ser capaz de manejar esa llamada. Si no hay una mascota con el id 123456
entonces debería devolver 404. Problema resuelto. Si la hay, entonces debería devolver el SPA. La aplicación debe manejar la situación en consecuencia.
Prueba esto
angular.module(''pets'', [])
.config(function($routeProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$routeProvider.when(''/pet/:petId'', {
controller: ''petController''
}). otherwise({ yourUrl:''/404.html''}) // Render 404 view;
})