我正在使用$routeProvider和$locationProvider在一个单页面应用程序中处理推状态URLS,如下所示:
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;
});
});
URL用于从可能存在也可能不存在的服务器中提取内容。
如果这是一个普通的多页面网站,缺少内容的请求将触发来自服务器的404头响应,而移动内容的请求将触发301。这将提醒Google注意丢失或移动的内容。
例如,我点击了一个URL,如下所示:
http://example.com/pet/123456
如果数据库中没有这样的宠物,我的SPA怎么能对该内容返回404。
如果失败,是否有其他方法可以正确地提醒用户或搜索引擎所请求的URL不存在?有没有其他我没有考虑的解决方案?
发布于 2015-01-09 23:15:12
真正的问题是http://example.com/pet/123456
到底返回什么了吗?
如果您的起点是http://example.com/
,并且有一个到http://example.com/pet/123456
的链接,那么Angular将调用petController
,而后者又会向http://example.com/api/pet/123456
发出AJAX调用。
爬虫不会这样做,而是会尝试直接调用http://example.com/pet/123456
。
因此您的服务器必须能够处理该调用。如果没有id为123456
的宠物,那么它应该返回404。问题解决了。如果存在,则应返回SPA。然后,应用程序应该相应地处理这种情况。
发布于 2015-07-08 05:56:14
根据此答案How do search engines deal with AngularJS applications?,您应该使用Headless Browser来处理爬虫请求,并使用适当的响应码返回页面快照。https://developers.google.com/webmasters/ajax-crawling/docs/html-snapshot
谷歌的例子不包括301,302或404个案例。但是,可以修改它们的代码以分析快照的内容并更改响应代码。
我发现prerender.io提供了这项服务,但它不是免费的。但是,如果你的页面少于250页,他们有一个免费的计划。Prerender要求在404或301的情况下,向DOM添加一个meta标记。
<meta name="prerender-status-code" content="404">
这个元标签然后被他们的无头浏览器检测到,并且响应码被改变。
发布于 2015-01-08 21:57:26
尝尝这个
angular.module('pets', [])
.config(function($routeProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$routeProvider.when('/pet/:petId', {
controller: 'petController'
}). otherwise({ yourUrl:'/404.html'}) // Render 404 view;
})
https://stackoverflow.com/questions/27797454
复制相似问题