在SPA(单页面应用程序)中使用node.js + express.js在服务器端dynamic生成内容的SEO

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

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

我的想法是定义与客户端相同的路由结构,并在search参数中传递客户端路由系统的路由:

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

然后在客户端,我可以在JavaScript中捕捉并select正确的路线。 在这里当然我有另一个问题 – 据我所知,谷歌机器人不运行JavaScript ..但在这里,我可以使用prerender.io中间件,我猜。

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

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

使用prerender.io作为pipe道的第一个中间件:

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

如果您有查询string,Googlebot可以用来调用一致的内容,那么您可以在网站站长中注明: https : //support.google.com/webmasters/answer/6080548?rd = 1

这是我的一个例子: 在这里输入图像描述

Google只想索引具有一致内容的网页。 如果每个用户的内容都不一样 – 那么你想在每个页面上设置一个rel =“canonical”标签,指出这个dynamic生成内容的“开始”位置。

这个想法是让网站pipe理员适应你的应用程序,而不是相反。 试图“欺骗”机器人在search引擎优化可能会有可怕的后果,因为谷歌确实有人类检查,偶尔给域名评级。 如果他们发现search索引的URL与他们在浏览器中看到的内容不一致,您将从懒惰的操作员那里获得一个标志。 这里是手册操作员遵循 。