Durandal 2.0路由器可以代替#!用于ajax网络抓取目的?

cco*_*rin 10 javascript ajax jquery single-page-application durandal

是否有可能替换Durandal 2.0中的默认路由器行为来替换默认路由,例如:'mysite.com/#/myroute'与'mysite.com/#!/myroute'的原因是为了谷歌蜘蛛检测页面是ajax爬行能力,我需要在url中插入一个hashbang而不仅仅是一个hashtag.任何帮助将不胜感激.

谢谢!

mar*_*bit 6

据我所知,在Durandal 2.0中你无法做到这一点.在routerhistory插件不支持这一点,因为在代码依赖于一些地方它不会是一个简单的办法#.

但是,我不认为这是您的方案中的问题.也许您需要改变处理使应用程序可抓取的要求的方式.

您仍然可以通过在应用程序#的主HTML中指定元片段类型来使您的应用程序SEO兼容:

<meta name="fragment" content="!">
Run Code Online (Sandbox Code Playgroud)

因此,您告诉谷歌您的链接没有,#!但应用程序正在使用JavaScript呈现.然后来自爬虫的请求将包括 ?_escaped_fragment_.

所以在你的应用程序中你将使用:

mysite.com/#myroute
Run Code Online (Sandbox Code Playgroud)

并且爬虫将请求:

mysite.com?_escaped_fragment_=myroute
Run Code Online (Sandbox Code Playgroud)

查看有关抓取的Google 文档的第3部分,了解有关元碎片标记的更多信息.

建议

如果你想充分利用这个功能,我建议通过激活路由器在Durandal 2.0中使用pushState:

router.activate({ pushState: true } );
Run Code Online (Sandbox Code Playgroud)

还包括meta fragment标签.

 <meta name="fragment" content="!">
Run Code Online (Sandbox Code Playgroud)

使用pushState时应该考虑的事项:

  • 仅在您不打算支持旧浏览器时才使用pushState.

  • 您需要使服务器端pushState准备就绪,这意味着当请求服务器时mysite.com/myroute应该能够返回相同的JS应用程序并让客户端处理查询字符串参数.例如,如果您使用的是ASP.NET,则可以使用IIS URL重写来实现.关于这个主题有一篇很好的博客文章.