2016-03-07 81 views
1

我的客户端代码是带有自己的路由系统的单页应用程序(用knockout.js编写),所以当谷歌爬虫机器人会尝试访问链接(与后端请求新页面无关,但只是客户端路由的一部分),它会要求服务器(node.js + express.js)为页面提供服务(例如'mywebsite/about'),当然服务器将返回404,因为它不知道客户端路由系统。这是我目前的服务器代码:在服务器端使用node.js + express.js在SPA(单页应用程序)中动态生成内容的SEO

router.get('*', function(req, res, next) { 
    res.sendFile(path.resolve('../dist/index.html')); 
}); 

我的想法是定义相同的路由结构中的客户端,并通过客户端路由系统击溃在搜索参数:

在客户端我
router.get('/about', function(req, res, next) { 
    res.sendFile(path.resolve('../dist/index.html?tab=about')); 
}); 

然后可以在javascript中捕获它并选择正确的路线。 在这里当然我有另一个问题 - 据我了解谷歌机器人不运行JavaScript ..但在这里我可以使用prerender.io中间件,我猜。

1)这是一个正确的方式与单页面应用程序生成的内容和搜索引擎优化?

2)如何从express.js传递搜索参数?

+0

使用prerender.io,您不应该在服务器中声明客户端路由,因为它在提供应用的静态(预渲染)版本之前运行JavaScript。 一个非常好的解决方案应该是使您的应用程序具有通用性。尝试看看:https://medium.com/@mjackson/universal-javascript-4761051b7ae9#.s39fzaj0k – Hitmands

+0

@Hitmands,但是,爬虫机器人会看到一个链接,并要求我的服务器提供链接页面。这就是问题所在,因为我的服务器只知道index.html,而对客户端路由一无所知。所以每个链接请求抓取工具都会从服务器获取相同的index.html页面。 – 31415926

+0

但是,这是预期的行为,你的服务器必须始终服务于索引,然后,使用预渲染,你应该能够处理客户端路由...可能是不正确的prerender.io中间件的顺序! – Hitmands

回答

1

使用prerender.io作为你管的第一中间件:

app.use(require('prerender-node').set('prerenderToken', 'YOUR_TOKEN')); app.get('*', (req, res) => res.render('index.html'));

+0

嗯,酷..不知道它的自动管理。但我怎么能验证mysite/about请求实际上是截获prerender.io返回正确的prerendered html到谷歌机器人? – 31415926

+0

您需要使用爬虫用户代理模拟爬行请求,然后检查您的页面是否为静态HTML! – Hitmands

+0

thx有价值的信息。有没有办法在我的本地主机上做到这一点?模拟如何? – 31415926

4

如果您有Googlebot可使用召回一致的内容查询字符串,那么你可以在网站管理员说明这一点: https://support.google.com/webmasters/answer/6080548?rd=1

这里的设置我的了一个例子: enter image description here

谷歌希望只指数具有一致内容的网页。如果每个用户的内容都不一样 - 那么您需要在每个页面上设置一个rel =“canonical”标签,指明该动态生成内容的“开始”位置。

这个想法是让网站管理员适应你的应用而不是其他方式。试图“欺骗”机器人可能会对搜索引擎优化产生可怕的后果,因为Google确实有人为检查者偶尔对域名进行评级。如果他们发现搜索索引的URL与他们在浏览器中看到的内容不一致,那么您将从懒惰的运营商那里获得一个标志。这里是the handbook operators follow

相关问题