【问题标题】:Crawlable Ajax content. SEO-ing without hashbang. Is my way ok?可抓取的 Ajax 内容。没有 hashbang 的 SEO-ing。我的方法好吗?
【发布时间】:2012-06-05 12:37:26
【问题描述】:

我将基于 ajax 构建我的应用程序,我的 URL 类似于:

http://server.com/module/#function_name,param1,param2...etc

在参考了一些关于 google 建议的讨论后:hashbang (#!),我不难意识到这不是最好的解决方案。有几个原因:

  • 无论如何,URL 都很难看。
  • 如果有一天谷歌(或其他一些搜索引擎)提出比 hashbang 更好的解决方案,那就太糟糕了。我必须用 hashbang 保留我丑陋的 url,或者编写一些 js 代码来使指向我的页面的链接仍然存在。
  • HTML5 pushState 终有一天会流行起来。

对于以上所有事情,我决定按照自己的方式进行:我的导航链接将是这样的:

<a href="http://server.com/module/for-crawler/function-name/param1/param2/...">
Some text </a>

并且一些 jQuery 代码将使其能够加载 ajax 内容,而不是像普通链接那样进行页面更改:

$(function(){
    $('a').live('click',function(e){
        var realURL = translateURL( $(this).attr('href') )
        loadContent( realURL );
        e.prevetnDefault(); 
        return false;
    })
})
/* -- the function translateURL will turn url like :
..... http://server.com/module/for-crawler/function-name/param1/param2/...
Into:
..... http://server.com/module/#function-name/param1/param2/...
    That's the real url I think all ajaxers are used to dealing with
*/

当爬虫读取我的页面时,它会跟随“href”属性中的url,我会提供我页面的静态非js版本供google阅读。几天后,我的页面被编入索引,用户将在 Google 的搜索结果中看到我的页面,如下所示:

http://server.com/module/for-crawler/function-name/param1/param2/...

我将再次使用用户 js 将用户重定向到我的正常 ajax 版本,我的意思是,到真正的 URL:

http://server.com/module/#function-name/param1/param2/...

这是我目前能想到的最佳方法。请给我建议:我应该这样做,还是可以做得更好?谢谢大家!

【问题讨论】:

  • 当搜索引擎查看您的网址时,他们会认为您的网站有多个目录,他们可能不会费心往下走。搜索引擎是否甚至需要担心您的参数,您的 URL 不能像“/function-name?someparam&anotherparam
  • @MatthewRiches:我的网址只是为了演示,它可以是斜杠“/”或任何东西来分隔我的参数。

标签: ajax url seo web-crawler hashbang


【解决方案1】:

根据您的受众,我建议还是使用 HTML5 PushState。

如果客户端不支持 HTML5 PushState,让他简单地使用与爬虫相同的应用版本。在我看来,页面重新加载并不像散列 URL 那样糟糕。由于用户共享 URL,因此您的散列 URL 会暴露给其他用户。此 URL 不适用于 Facebook 链接共享预览或任何其他不支持 JavaScript 的客户端。

相反,我只会将爬虫友好型应用与 HTML5 PushState 结合使用。使用 PushState,您将始终公开一个 URL,独立于客户端的 JavaScript 支持。

首先检测是否支持PushState:

function supports_history_api() { return !!(window.history && history.pushState); }

那么您的click-handler 将如下所示:

$('a').live('click',function(e){
  var url = $(this).attr('href');
  e.preventDefault();
  loadContent( url );
  history.pushState({"url":url}, $(this).attr('title'), url);
  return false;
})

【讨论】:

  • 我认为“非 HTML5”用户比“非 JS”用户多得多。而且我不想因为非 js 版本的无聊布局而失去非 HTML5 用户。至少在这个时候,当 pushState 和 HTML5 没有被广泛采用时。 BTW:你知道目前哪个浏览器支持 pushState 吗?
猜你喜欢
  • 2014-05-30
  • 2011-11-26
  • 1970-01-01
  • 2014-10-23
  • 2013-04-12
  • 2011-06-08
  • 1970-01-01
  • 2014-12-20
  • 2013-02-02
相关资源
最近更新 更多