【问题标题】:How do I return an http status code in an AngularJS single page application?如何在 AngularJS 单页应用程序中返回 http 状态代码?
【发布时间】:2014-08-04 04:56:57
【问题描述】:

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

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

【问题讨论】:

  • 很遗憾,所提供的信息不足以回答您的问题。这里有一些问题可能会帮助您了解全局并解决您的问题:您如何与服务器通信?您使用什么来加载 SAP 的部分页面?你在使用 $http angularjs 服务吗?当您在 SAP 中的页面之间切换时,您使用什么来处理状态(我暗示要路由)。你在服务器端有什么?是 ASP.Net 吗?谢谢。
  • 我说的不是服务器与 $http 的通信,我说的是可以提供给请求页面的搜索引擎的状态码。
  • 如果您使用的是 Prerender,您能否更新您的问题以反映您正在谈论使用 prerender 的网站? (prerender 没有提到,和 angular 无关)

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


【解决方案1】:

我没有得到你的问题 但是,如果您使用 $http.post org $http.get 来获取您想要的任何数据,则此 $http 请求可以返回一个承诺,并且该承诺具有 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】:

    @Jan,我不知道您对 SPA 和 SEO 有多熟悉,但最重要的是它们确实不能很好地协同工作。基本上,搜索引擎在其爬虫上运行一个无头浏览器,而无需运行太多 JavaScript。因此,如果您的应用程序确实是一个 SPA,那么您实际上只是在硬页面加载时提供索引文件,而这就是搜索引擎会抓取的全部内容。不过还是有希望的:Check this out...虽然它可能比你预想的要多一些

    【讨论】:

    • 您也可以使用Prerender,它使用Javascript 呈现您的页面,并为经过的爬虫提供静态版本。
    【解决方案3】:

    当您使用 Prerender 进行 SEO 时,您可以指定一个元标记,使 Prerender 向搜索引擎爬虫返回一个 http 状态代码:https://prerender.io/server#http-headers

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

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

    【讨论】:

      【解决方案4】:

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

      当您向服务器调用 /auction/103 时,服务器将回复您的 index.html 文件,该文件以 Angular 格式编写,并带有 200 状态码。然后,角度库会生成您看到的内容。此时即使 Angular 意识到请求的资源 /auction/103 没有路由,服务器已经发送了 headers 和 status code,所以这些不能改变。 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'))
        }
      })
      

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

      【讨论】:

        猜你喜欢
        • 2018-09-23
        • 2015-02-16
        • 1970-01-01
        • 2015-01-12
        • 2012-02-11
        • 2016-09-16
        • 2014-11-06
        • 1970-01-01
        • 2014-02-08
        相关资源
        最近更新 更多