阻止 Google 索引 AngularJS 路由

Prevent Google indexing an AngularJS route

通常,如果我不想 Google 抓取某个页面,我会像这样将页面添加到我的 robots.txt 文件中:

User-agent: *
Disallow: /my-page

为了防止 Google 将该页面编入索引,我将从我的 sitemap.xml 中删除该页面,将以下元标记添加到该页面的 <head> 中:

<meta name="robots" content="noindex">

现在,如果我使用 AngularJS 来处理单个页面应用程序的所有路由,如何停止 Google 索引 and/or 抓取路由? Angular 为每条路线在 ng-view 中带来内容,因此 <head> 中的信息在每条路线上保持相同。我不认为我可以在这种情况下添加元标记。

如果你的根模块放在<html>标签上(<html ng-app="myApp">),你可以修改<head>中的所有属性。这允许您为每个页面动态设置机器人 <meta>。您可以使用根模块中的 $routeChangeSuccess 事件来做到这一点。如果您使用 ui-router,您可以在路由上设置一个 'data' 属性,您可以在每次状态更改时读取该路由。您也可以使用 $rootScope 从其他模块更新这个值,但这不是一个好的做法。最好的方法是从子 controllers/directives 向根模块广播更改。

我有一个动态更改页面 <title> 的示例,但它有点复杂,因为此应用程序是手动引导的。但是,假设 <html> 标签上有一个 ng-app="" 和 ng-controller="" 指令。

这是状态更改事件:https://github.com/danmindru/angular-boilerplate-study/blob/master/src/app/_app-main/_app-main.controller.js#L14-L24

这里是广播的监听器:https://github.com/danmindru/angular-boilerplate-study/blob/master/src/app/_app-main/_app-main.controller.js#L38-L40

广播的触发方式如下:https://github.com/danmindru/angular-boilerplate-study/blob/master/src/app/profile-feature/customer-page/customer-page.controller.js#L12

这是 <title> 绑定:https://github.com/danmindru/angular-boilerplate-study/blob/master/src/index.html#L4

但是,Google 不太擅长读取这些属性,因此您必须使用预呈现服务来确保 googlebot 将解析 <meta name="robots" content="noindex"> 而不是 <meta name="robots" content="{{index}}">.