使用#时避免额外的页面加载! AJAX导航

时间:2011-08-27 11:22:26

标签: javascript ajax web-crawler hashbang

我正在写一个基本上是一系列连续页面的网站。非限定URL指向最后一页,限定URL指向特定页面。所以我们有:

我有以下要求:

  • 我希望AJAX动态加载页面。用户可以在短时间内顺序浏览大量连续页面,我希望避免重新加载和重绘(并添加某些JavaScript预取相邻页面以加快导航速度)。
  • 我希望这些网页可以加入书签
  • 我希望网页可以抓取
  • 我希望它适用于大多数用户。

所以,我想出了以下方案:

  • 存档页面的标准规范网址为http://example.com/3。无论是否安装了JavaScript,通过此URL访问的页面都是完全可读的。如果JavaScript不可用,那么指向其他页面的链接就是普通链接,一切都以老式的方式运行。这也适用于抓取工具。
  • 如果浏览器中有JavaScript和历史记录操作(pushState和replaceState)可访问此类和URL,则在访问指向其他页面的链接时,将使用AJAX动态更新内容。然后,JavaScript会更新浏览器历史记录。
  • 如果浏览器中有JavaScript,但历史记录操作不可用,请访问该网站,用户在访问http://example.com/#!3时会使用JavaScript重定向到http://example.com/3。访问主页http://example.com时没有重定向。然后使用散列更改事件完成导航。
  • 如果抓取工具尝试通过外部链接http://example.com/#!3访问,则会实际请求http://example.com/?_escaped_fragment_=31)。对于此类网址,网络服务器会向http://example.com/3发出永久重定向,然后对其进行正确抓取。

这里的一切看起来都不错,但接下来,让我们看看所有可能的情况:


1。没有JavaScript浏览器

1.1。没有JavaScript浏览器访问根URL

按预期工作。

1.2。没有JavaScript浏览器访问规范网址

按预期工作。

1.3。没有JavaScript浏览器访问shebang URL

http://example.com/#!3

默默地失败了!用户获取最后一页而不是第3页。

2。履带

2.1。抓取工具访问根网址

按预期工作。

2.2。抓取工具访问规范网址

按预期工作。

2.3。爬虫访问shebang URL

http://example.com/#!3

抓取工具实际请求http://example.com/?_escaped_fragment_=3,并向该规范网址发出重定向。这是对Web服务器的一个额外请求,但这没什么大不了的(没有从数据库中获取额外的页面并返回给用户)。

3。旧浏览器

3.1。旧浏览器访问根URL

其他页面的链接被其shebang版本取代。然后由AJAX顺利完成导航。

3.2。旧浏览器访问规范URL

向用户发送重定向到shebang URL。问题:服务器实际上将获取并提供3次页面服务!

  1. http://example.com/3< - 完全由服务器提供
  2. JavaScript会将重定向发送到http://example.com/#!3
  3. 服务器只能看到http://example.com/,并提供最后一页
  4. JSON用于获取(再次)第3页并替换页面上的内容。
  5. 3.3。旧浏览器访问shebang URL

    不需要重定向,但最后一页有额外的负载!

    1. 用户转到http://example.com/#!3
    2. 服务器只能看到http://example.com/,并提供最后一页
    3. JSON用于获取第3页并替换页面上的内容。
    4. 4。现代浏览器

      4.1。现代浏览器访问根URL

      4.2。现代浏览器访问规范URL

      这2例没问题。导航由AJAX完成,规范URL被推送到历史记录。

      4.3。现代浏览器访问shebang URL

      将URL修改为规范URL。内容由AJAX加载。像以前一样,问题是导致从服务器到最后一页的额外负载。


      所以,总结一下:

      • 此解决方案基本上可以正常工作
      • 但是当使用shebang URL时,在大多数情况下会导致最后一页的不必要的负载,因为服务器永远不会知道它是否需要服务于最后一页,或者是否这实际上是shebang请求的一部分。

      我的问题是:有人对如何避免这些额外的页面加载有一个好主意吗?有什么好的做法可以解决这个问题吗?

0 个答案:

没有答案