我的客户端代码是带有自己的路由系统的单页应用程序(用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传递搜索参数?
使用prerender.io,您不应该在服务器中声明客户端路由,因为它在提供应用的静态(预渲染)版本之前运行JavaScript。 一个非常好的解决方案应该是使您的应用程序具有通用性。尝试看看:https://medium.com/@mjackson/universal-javascript-4761051b7ae9#.s39fzaj0k – Hitmands
@Hitmands,但是,爬虫机器人会看到一个链接,并要求我的服务器提供链接页面。这就是问题所在,因为我的服务器只知道index.html,而对客户端路由一无所知。所以每个链接请求抓取工具都会从服务器获取相同的index.html页面。 – 31415926
但是,这是预期的行为,你的服务器必须始终服务于索引,然后,使用预渲染,你应该能够处理客户端路由...可能是不正确的prerender.io中间件的顺序! – Hitmands