如何在AngularJS单页面应用程序中返回http状态代码?

时间:2014-06-13 15:09:01

标签: angularjs seo single-page-application http-status-codes

我有一个AngularJS单页面应用程序,用于显示短生命资源,其中包含/ auction / 103等网址。但是,当资源不再可用时,我希望从搜索引擎索引中删除该页面。因此,我需要在搜索引擎爬虫经过时返回状态代码410或404。

但是,如何在单页应用程序中执行此操作,其中页面未在服务器上呈现?

4 个答案:

答案 0 :(得分:6)

当您使用Prerender进行搜索引擎优化时,您可以指定一个元标记,使Prerender将http状态代码返回给搜索引擎抓取工具:https://prerender.io/server#http-headers

<meta name="prerender-status-code" content="404">

我使用AngularJS创建了一个Plunker来说明这一点:http://plnkr.co/edit/Z0HdMd

答案 1 :(得分:0)

我没有得到你的问题 但是,如果你使用$ http.post org $ http.get来获取你想要的数据,这个$ http请求可以返回一个promise并且该promise具有http状态。像这样

      $scope.yourFunction = function($http){
         var promise = $http.post('YourURL',{Your data to send});
             promise.then(function(msg){
                console.log('promise', msg.status);
             // now you can see your status in your console !
            })
       }

答案 2 :(得分:0)

@Jan,我不知道你对SPA和搜索引擎优化有多熟悉,但最重要的是他们真的不能很好地协同工作。基本上,搜索引擎在其爬虫上运行无头浏览器,而无需运行很多JavaScript。因此,如果您的应用程序确实是SPA,那么您实际上只是在硬页面加载时提供索引文件,并且所有这些都将被搜索引擎抓取。但是有希望:Check this out ......虽然它可能比你讨价还价的要多一点

答案 3 :(得分:0)

作为客户端库的Angular无法设置/发送404或任何其他标头/状态码。那是服务器的工作。

当您致电/auction/103的服务器时,服务器将以用index.html状态码成角度写入的200文件作为响应。然后,角度库将生成您看到的内容。此时,即使angular意识到请求的资源/auction/103没有路由,服务器也已经发送了标头和状态代码,因此它们无法更改。 angular唯一可以做的就是显示404页(如果已设置)。

但是修复并不容易。正如其他答案所指出的那样,您可以使用其他服务提供商来处理此问题,但是要在服务器端进行处理,则需要捕获请求,确定页面是否存在,然后发送index.html页或404.html页。下面是我节点的server.js文件中的一个非常原始的示例。

// Send every request to `handleRequest()` method which determines if the requested resource exists.
// E.g. I will check if /auction/103 exists in database and will return false if it does not.
app.get('*', function (request, response) {
  if (handleRequest(request) !== false) {
    response.sendFile(path.join(__dirname, 'index.html'))
  } else {
    response.status(404)
    response.sendFile(path.join(__dirname, '404.html'))
  }
})

您当然可以编辑此逻辑以更好地满足您的需求,但要旨是确定服务器本身上资源的存在。