如何使用 Angular 预合成在 Google 上显示页面标题?
How to show page title on Google with Angular Precomposition?
基于超级响应 here 我已经设置了一个 Angular 1 应用程序,没有 Hashbangs 和 html5Mode(true) 并依靠 Google 来执行 javascript。该页面正在被 Google 编入索引,但动态标题和描述标签未被编入索引。
我的index.html头像如下:
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<base href="/">
<meta name="author" content="me">
<meta name="robots" content="index,follow">
<title ng-bind="meta.title">Temp Title</title>
<meta name="description" content="{{meta.description}}">
<!-- Scripts & CSS -->
</head>
标题和描述已正确加载,但未在 Google 上显示。
我该怎么做?
这种技术也适用于 Facebook 和其他社交网络吗?谢谢。
你为什么不用那样的东西?
其实超光速反应here有解决办法。 HTML 页头必须由服务器完全解析发送。
因此,为了使此解决方案起作用,我被迫在服务器端复制 angular 路由并发送已解析的信息。
我没有使用普通的 html 视图,而是更改为 .ejs 并将 header 更改为如下内容:
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<base href="/">
<meta name="robots" content="index,follow">
<script type="text/javascript">
window.title = <%- JSON.stringify(precomposition) %>.title;
</script>
<title ng-bind="title"><%= precomposition.title %></title>
<meta name="description" content="<%= precomposition.description %>">
<!-- More meta information -->
<!-- Scripts & CSS -->
</head>
现在当网站被直接点击时(最初由服务器而不是 Angular 解析,爬虫总是这样)我处理请求服务器端:
//Express route
app.route('/').get(precomposition.render);
//precomposition
exports.render = function (req, res) {
const precomposition = {title: 'tile', description: 'description'};
res.locals.precomposition = precomposition;
res.render('index.ejs');
};
如果不是直接命中 Angular 处理标题更新(因为其他信息不会显示给用户)。
它当然有一些缺点,但 Google 自 2015 年 10 月以来推荐这种方法而不是“_escaped_fragment_ URL”。此外,我认为它比自托管 pre-render 替代方案消耗的资源少得多,而且比付费替代方案便宜。
基于超级响应 here 我已经设置了一个 Angular 1 应用程序,没有 Hashbangs 和 html5Mode(true) 并依靠 Google 来执行 javascript。该页面正在被 Google 编入索引,但动态标题和描述标签未被编入索引。
我的index.html头像如下:
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<base href="/">
<meta name="author" content="me">
<meta name="robots" content="index,follow">
<title ng-bind="meta.title">Temp Title</title>
<meta name="description" content="{{meta.description}}">
<!-- Scripts & CSS -->
</head>
标题和描述已正确加载,但未在 Google 上显示。
我该怎么做?
这种技术也适用于 Facebook 和其他社交网络吗?谢谢。
你为什么不用那样的东西?
其实超光速反应here有解决办法。 HTML 页头必须由服务器完全解析发送。
因此,为了使此解决方案起作用,我被迫在服务器端复制 angular 路由并发送已解析的信息。
我没有使用普通的 html 视图,而是更改为 .ejs 并将 header 更改为如下内容:
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<base href="/">
<meta name="robots" content="index,follow">
<script type="text/javascript">
window.title = <%- JSON.stringify(precomposition) %>.title;
</script>
<title ng-bind="title"><%= precomposition.title %></title>
<meta name="description" content="<%= precomposition.description %>">
<!-- More meta information -->
<!-- Scripts & CSS -->
</head>
现在当网站被直接点击时(最初由服务器而不是 Angular 解析,爬虫总是这样)我处理请求服务器端:
//Express route
app.route('/').get(precomposition.render);
//precomposition
exports.render = function (req, res) {
const precomposition = {title: 'tile', description: 'description'};
res.locals.precomposition = precomposition;
res.render('index.ejs');
};
如果不是直接命中 Angular 处理标题更新(因为其他信息不会显示给用户)。
它当然有一些缺点,但 Google 自 2015 年 10 月以来推荐这种方法而不是“_escaped_fragment_ URL”。此外,我认为它比自托管 pre-render 替代方案消耗的资源少得多,而且比付费替代方案便宜。