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

时间:2013-08-25 10:49:17

标签: javascript jquery ajax single-page-application durandal

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

谢谢!

1 个答案:

答案 0 :(得分:6)

据我所知,在Durandal 2.0中你无法做到这一点。 routerhistory插件不支持此功能,因为代码中有一些地方依赖于#,所以这不是一个简单的修复。

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

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

<meta name="fragment" content="!">

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

因此,在您的应用中,您将使用:

mysite.com/#myroute

并且抓取工具会请求:

mysite.com?_escaped_fragment_=myroute

查看Google documentation on crawling的第3部分,了解有关元片段代码的更多信息。

<强> SUGGESTION

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

router.activate({ pushState: true } );

还包括meta fragment标签。

 <meta name="fragment" content="!">

使用pushState时应考虑的事项:

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

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