我想检测请求是来自prerender.io(用于在来自爬虫的请求时呈现angularjs应用程序的库)还是来自真实用户。如果请求来自prerender,那么我必须重定向到仅页面专为SEO目的而设计。
我尝试设置cookie来检测但是它不起作用,因为prerender.io执行javascript代码甚至cookie /会话存储在prerender.io中工作。
经过一些研究,我发现我们可以检测到用户代理,因为prerender.io在无头浏览器中调用网站(即phantomJS)
if (/PhantomJS/.test(window.navigator.userAgent)) {
// console.log("PhantomJS environment detected.");
} else {
// console.log("PhantomJS environment not detected.");
}
但它是否是此问题的永久/正确/最佳解决方案?还有其他解决方案吗?
答案 0 :(得分:0)
检测来自GoogleBot的请求:
您可以按照Google在以下文章中的建议使用IP范围和UserAgent,以便在GoogleBot的情况下重定向。
https://support.google.com/webmasters/answer/80553
对于其他情况,您只能使用UserAgent,类似于您现在正在执行的操作。
答案 1 :(得分:0)
您可以查看" Prerender"在用户代理中但我不建议在检测到Prerender.io浏览器时更改页面内容,因为这被认为是隐藏真实内容。
您希望为抓取工具提供用户看到的同一页面的原始HTML。
答案 2 :(得分:0)
In their FAQ, you can see the UserAgent they use:
您的抓取工具的用户代理是什么?
Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / 537.36(KHTML,例如Gecko)HeadlessChrome / 61.0.3159.5 Safari / 537.36 Prerender(+ https://github.com/prerender/prerender)
您可以使用userAgent来了解请求是否来自其搜寻器。
答案 3 :(得分:0)
预渲染检测
根据 Prerender 文档,最好在用户代理中搜索 Prerender,而不是搜索字符串的任何其他部分,因为它们会不断升级其 Chrome 版本,因此这些可以随时更改。
var isPrerender = navigator.userAgent.toLowerCase().indexOf('prerender') !== -1;
https://docs.prerender.io/article/7-faq
永久/正确/最佳修复
我添加是为了完整性,因为其他答案中提到了 GoogleBot 检测。我知道的一个项目是这样建立的:
当您的网络应用程序被调用时,需要检查用户代理,如果客户端是机器人,您应该调用预渲染,并且您需要传递所请求页面的网址。
Prerender 将转到页面,呈现它并返回一个 HTML,该 HTML 应在响应中发回。
您的网址将被机器人访问两次,然后被预渲染访问。您也可以检测预渲染,并通过针对无头浏览器不起作用的解决方法、删除闪屏和设置 window.prerenderReady
标志 https://docs.prerender.io/article/11-best-practices 来使事情变得更容易。
如果用户代理既不是机器人也不是预渲染,那么您可以像往常一样做事,无需调整即可为您的 Angular 应用提供服务。
机器人检测和预渲染调用发生在服务器端或在 http 调用到达您的应用程序之前拦截它们的解决方案中。有一些我熟悉的,列表并不详尽: