我刚刚将prerender.io middlewave设置到我的tomcat服务器中(运行一些java webservices和一个angularjs应用程序).
服务(prerender)工作正常,我可以看到页面添加到列表中(当我发送请求模拟用户代理时).
我的问题是Facebook分享按钮(来自addthis).
基本上,如果我访问一个尚未缓存的页面并单击"在Facebook上共享"按钮,它将显示angularjs模板而不是"渲染"模板.
奇怪的是,我可以在Prerender.io admin上看到该页面.
它就像它太慢而且超时.我仍然不知道如何获得页面的非缓存版本.
在第一次错误调用Facebook缓存页面后,如果我不从Facebook对象调试器(https://developers.facebook.com/tools/debug/og/object)手动刷新它,错误的页面将保持缓存在FB上服务器,直到刷新FB缓存.
无论如何有任何关于如何解决这个问题的建议?
我可以预先缓存每一页,但我将不得不处理新的页面,我不认为这是一个很好的解决方案.
谢谢,Dem
我用AngularJS和expressJS后端制作了一个应用程序.现在我想让它可抓取,我发现prerender.io.我认为我已经完成了一切正确的bur因为某些原因我在prerenderer仪表板中没有看到任何统计信息.
在我的app.configure函数中,我包含了如下标记:
app.use(require('prerender-node').set('prerenderToken', 'my-token'));
Run Code Online (Sandbox Code Playgroud)
在我的HTML中,我已经包含了元片段标记:
<meta name="fragment" content="!">
Run Code Online (Sandbox Code Playgroud)
我做的最后一件事是告诉AngularJS使用hashprefix:
$locationProvider.html5Mode(false);
$locationProvider.hashPrefix('!');
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,如果我参考文档,我得不到正确的结果.下面你可以看到它应该做什么:
Google会向您的服务器发送请求,如下所示:
http://www.example.com/?_escaped_fragment_=/user/123
你把网址变成了这个:
出于某种原因,如果我尝试这个,它仍然会添加#!标志添加了URL的结尾,所以如果我请求我的应用程序的URL像谷歌我得到这个:
所以它不会替换url中的哈希值.我认为这是我的问题的原因.
提前致谢!
编辑 - 如果我例如添加一个额外的路线,那么它的工作原理:
app.get('/', function (req, res) {
res.sendfile('./public/index.html');
});
app.get('/test', function (req, res) {
res.sendfile('./public/index.html');
});
Run Code Online (Sandbox Code Playgroud)
在'/'不上班路线'/test'的路线不工作.
我在运行Nginx的应用程序中包含prerender时遇到问题,我已经定义了一个简单的规则,用于将所有http请求重写为https,但是预渲染在运行GoDaddy证书的https上有一些问题,它会缓存页面但内容为空.我已经在http上测试了它并且工作正常,我现在正在尝试的是,如果我http_user_agent是Prerender,我想保持http网址完好无损,否则将网址重写为https.
欢迎任何帮助/意见/建议.
我想在模拟服务器上使用prerenderio和Meteor而不是phantomjs.
但是根据它们提供的示例,我不确定如何集成它.它们只提供一个节点表达中间件,它不能100%转换.
我试图在我的ASP.NET应用程序中实现Prerender.io.我配置了所有必需的步骤,包括
1)<meta name="fragment" content="!">在Index.html的负责人
2)配置模块
<httpModules>
<add name="Prerender" type="Prerender.io.PrerenderModule, IslamicMatchMakers.Web, Version=1.0.0.0, Culture=neutral" />
</httpModules>
Run Code Online (Sandbox Code Playgroud)
3)添加了自定义标题
<httpProtocol>
<customHeaders>
<add name="X-Prerender-Token" value="XXXX" />
</customHeaders>
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)
4)定义的重写规则
<rewrite>
<rules>
<!--# Only proxy the request to Prerender if it's a request for HTML-->
<rule name="Prerender" stopProcessing="true">
<match url="^(?!.*?(\.js|\.css|\.xml|\.less|\.png|\.jpg|\.jpeg|\.gif|\.pdf|\.doc|\.txt|\.ico|\.rss|\.zip|\.mp3|\.rar|\.exe|\.wmv|\.doc|\.avi|\.ppt|\.mpg|\.mpeg|\.tif|\.wav|\.mov|\.psd|\.ai|\.xls|\.mp4|\.m4a|\.swf|\.dat|\.dmg|\.iso|\.flv|\.m4v|\.torrent))(.*)" ignoreCase="false" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_USER_AGENT}" pattern="baiduspider|facebookexternalhit|twitterbot" />
<add input="{QUERY_STRING}" pattern="_escaped_fragment_" ignoreCase="false" />
</conditions>
<action type="Rewrite" url="http://service.prerender.io/http://{HTTP_HOST}/{R:1}" />
</rule>
<rule name="Html5Mode" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{URL}" …Run Code Online (Sandbox Code Playgroud) 我正在使用Parse.com构建一个网站,并尝试通过FB和Google机器人抓取它.该网站基于parse.com,不使用Angular.
我已经查看了这里的主题,并在我的结尾设置相应的东西.我已经创建了一个端点来测试这些东西:
app.get('/hello/:id', function(req, res) {
res.render('hello');
});
Run Code Online (Sandbox Code Playgroud)
以下是我在日志中的内容,当谷歌机器人提取网址时
https://www.example.org/hello/#!a/b
I2015-11-10T05:35:18.580Z]v642 Ran custom endpoint with:
Input: {"method":"GET","url":"/hello/","headers":{"accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","accept-encoding":"gzip,deflate","cache-control":"no-cache","from":"googlebot(at)googlebot.com","host":"www.example.org","user-agent":"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)","version":"HTTP/1.1","x-forwarded-for":"10.252.5.60","x-forwarded-proto":"https"}}
Result: Success
Run Code Online (Sandbox Code Playgroud)
由于Google抓取工具不会使用片段重写Url,因此会发送错误的网页快照(对应于没有参数的基本网址+路径).有趣的是,facebookbot用一个转义片段取代了shebang,然后获取下面的url:
/hello/?_escaped_fragment_=posts/abcdef
Run Code Online (Sandbox Code Playgroud)
在解析结束时正确处理,pre-render.io发送正确的缓存页面.
我几个小时以来一直在讨论这个问题,Parse的人们无处可寻找一个相当基本和重要的问题.
有人曾经设法让Parse的单页设计与谷歌和Facebook机器人合作,还是仅仅是一个失败的原因?
谢谢!
PS:现在看来,谷歌机器人尝试渲染AJAX页面,而不考虑转义的碎片.换句话说,现在看来,默认的行为,但在同一时间,现有的AJAX页面可能仍与逃脱片段爬......看到线程这里从Web开发人员的反馈.
我有一个web项目,它在前端使用角度2,在服务器端使用java spring 4.我对角度2有点新.我想使用角度通用进行预渲染.我怎么能够实现它?
是否有任何教程用服务器端的Java解释它?
还有其他图书馆会帮助我吗?
我正在使用create react app和react-snapshot为我的路线预渲染静态标记.即分别"/", "/signIn", "/signUp"生成index.html, signIn.html, signUp.html.
我面临的问题是无论我走哪条路线,最初都会index.html提供从根路由的react-snapshot生成的静态 "/",然后提供正确的静态路由文件,然后提供main.js捆绑(请参阅gif).如果我只是main.js单独捆绑我的应用程序,那就没关系了.但由于我想使用静态预生成的html文件,如何禁用服务工作者在我已经拥有静态html文件的某些路由上提供index.html.
更新:如果我从create react应用程序中删除服务工作者,该应用程序会加载路径正常的静态文件.但是,我想保留服务工作者的功能以获得PWA功能.
更新2: 在chrome browser根路由的快速闪烁上,静态标记仅针对每个路由发生一次.在第一次闪烁后,似乎Chrome浏览器缓存修复了它,另外如果我从chrome dev工具禁用缓存并尝试转到新路由,根路由的闪烁返回.对Firefox browser这个问题,无论什么存在,每个路线的变化或更新根航线的瞬间轻弹静态标记发生.
如何避免index.html最初在服务工作者的所有路由上呈现而不删除服务工作者.
更详细:
在Service Worker激活后,以下代码将在所有路径的页面源体中呈现:
<body>
<script>window.react_snapshot_state = {};</script>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root" data-react-checksum="-928641672"><div data-reactroot="" class="sc-cSHVUG hyLStb"><div class="sc-fjdhpX dIRAsX"><ul class="sc-gqjmRU koKaUp"><li><a class="navItemActive sc-VigVT cZrGwO" href="/"><!-- react-text: 6 --> <!-- /react-text --><!-- react-text: 7 -->Home<!-- /react-text --></a></li><li><a class="sc-VigVT cZrGwO" href="/aboutUs/"> About …Run Code Online (Sandbox Code Playgroud) 我正在使用 Angular 5。我在我的项目中添加了 Universal,参考: https: //angular.io/guide/universal。
我有 5 个组件,其中 2 个组件:Component1和Component2是静态的,没有任何打字稿代码,其他 3 个组件是动态的,它使用打字稿代码。
我还在我的应用程序中添加了预渲染代码。参考: https: //blog.angular-university.io/angular-universal/
我的问题是,我可以对某些页面使用预渲染,对某些页面使用 ssr,因为我必须改进静态页面的组件 1 和组件 2 的初始加载时间。即使我使用预渲染 ts 文件创建静态 html,当我从应用程序访问它时,它看起来好像已经加载了正常的 ssr 路由。那么,我可以在我的应用程序中进行预渲染和 ssr 吗?如果我可以使用,那么我该怎么做或者如何检查它是否适用于预渲染应用程序。
我为 CRA 设置了 prerender.io 并且它运行良好,但是当机器人点击没有参数的 URL 时,它会放在 URL 的末尾 - 字符串“.var”
我尝试了 (.*) 的变体,但似乎不起作用。有任何想法吗?
这是 .htaccess 文件
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
<IfModule mod_headers.c>
RequestHeader set X-Prerender-Token "TOKEN"
RequestHeader set X-Prerender-Version "prerender-apache@2.0.0"
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
<IfModule mod_proxy_http.c>
RewriteCond %{HTTP_USER_AGENT} googlebot|bingbot|yandex|baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest\/0\.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp [NC,OR]
RewriteCond %{QUERY_STRING} _escaped_fragment_
RewriteCond %{REQUEST_URI} ^(?!.*?(\.js|\.css|\.xml|\.less|\.png|\.jpg|\.jpeg|\.gif|\.pdf|\.doc|\.txt|\.ico|\.rss|\.zip|\.mp3|\.rar|\.exe|\.wmv|\.doc|\.avi|\.ppt|\.mpg|\.mpeg|\.tif|\.wav|\.mov|\.psd|\.ai|\.xls|\.mp4|\.m4a|\.swf|\.dat|\.dmg|\.iso|\.flv|\.m4v|\.torrent|\.ttf|\.woff|\.svg))
RewriteRule ^(index\.html|index\.php)?(.*) https://service.prerender.io/%{REQUEST_SCHEME}://%{HTTP_HOST}/$2 [P,END]
</IfModule>
</IfModule>
Run Code Online (Sandbox Code Playgroud)