2009-10-05 39 views
2

我想我的意思是,如果我制作了一个使用AJAX加载一些内容的网站,我还希望搜索引擎找到 - 如果我使页面工作sans-javascript(例如,当javascript不存在时,一个链接去site.com?c=somecontent,而不是调用$("#content").load("somecontent.html");)功能,搜索引擎会遵循非JavaScript链接,并能够索引该网站?可以大量使用AJAX的页面也可以搜索引擎友好吗?

我想这会工作,如果启用JavaScript的浏览器谁跟随搜索引擎链接到?c=somecontent链接仍然会正常使用该网站,对不对?

这是一个非常具有挑战性的尝试,或者如果网站结构正确,可以相对容易地完成这项工作吗?

回答

2

如果您的链接看起来是这样的:

<a href="http://site.com?c=somecontent" 
    onclick="Javascript:$('#content').load('somecontent.html'); return false;"> 
    Some link 
</a> 

它将优雅降级,而搜索引擎会很高兴。

您确实遇到的一个问题是,当某个启用了Javascript的用户浏览您的网站时,地址栏中的位置不会更改。这可以通过让onclick函数设置window.location.hash根据访问者所在页面更新url的哈希部分来克服。然后,在加载每个完整页面时,脚本应检查散列是否与当前页面匹配,如果不匹配,则使用AJAX调用切换到由散列指示的页面。

+0

好吧,如果我使用site.come/content/somecontent风格呢?我可以使用JavaScript更新吗?这样,无论何时我动态加载内容,我都可以更新URL以反映显示的内容,因此获取该内容的永久链接也更容易? – 2009-10-05 02:44:51

+0

您无法更改地址栏中的位置。如果你这样做,它会导致该位置加载。您只能更改散列符号后的地址部分。 – Joel 2009-10-05 02:48:15

+0

那么,坚持使用AJAX这些评论中的小部分信息会更好?看起来你发布了评论而没有重新加载页面?对我来说,我认为漂亮的URL比动态加载内容页面要重得多...... – 2009-10-05 02:51:06

1

这样做的最佳方式是构建没有任何ajax的网站并应用seo实践。那么当非Ajax版本工作时,添加一个名为“动态链接”或类的链接到你想成为ajax链接的链接。并处理这些链接上的点击事件。所以当机器人抓取该网站时,他们有一些东西可以回退。

+0

对,就像我在我的例子中所说的那样?在没有JavaScript的情况下,机器人将回归正常的URL而不是动态加载内容? – 2009-10-05 02:42:01

2

只需添加:如果您已注意到Facebook的工作方式 - 如果启用了Javascript,并且禁用Javascript(例如机器人),则AJAX仍然可以工作。

不要在你的链接是这样的(例如,寻呼):

<a href="view.php?t=231&p=2" onclick="loadpage(2); return false;">2</a> 
<script type="text/javascript">/* <![CDATA[ */ 

function loadpage(p){ 
$("loader").load("view.php?c=pageonly&t=231&p="+p); 
} 

/* ]]> */</script> 

因此,关键是在某种程度上AJAX工作在现代浏览器的设计,然而,当你禁用了JavaScript的网页仍然可以工作。

+0

这将不得不'返回false;'虽然正确? – 2009-10-05 02:41:16

+0

啊是的。 'return false;' – mauris 2009-10-06 08:01:03

1

这可能会产生问题,因为您最终会将页面的小碎片放入索引。

如果你可以避开它,用简单的旧的DHTML“伪造”ajax会容易得多。

<div id="content-display"></div> 

<div id="content-1">Some content</div> 
<div id="content-2">Some other content</div> 

<style> 
#content-1 { display:none; } 
#content-2 { display:none; } 
</style> 

<script> 
displayContent = function(contentId){ 
    $('#content-display').update($(contentId).innerHTML); 
} 
</script> 

现在你已经得到了所有的内容可见,搜索引擎,都在相同的(正确)的URI,但对于启用JavaScript的用户,它的作用类似于AJAX的解决方案(但速度更快,初始后加载,这有点慢)。

现在,如果你有一个TON的内容,你必须考虑更聪明的东西。但是,如果你的所有内容相对较少(不要忘记确保你的服务器对内容进行了gzip编码),那么这种设置是可取的。

否则,如果您拥有数百千字节(或更多)的文本内容,则必须使用更复杂的技术。你最初的想法是非常正确的。

<a href="/some/page.html" onclick="$('#content').load('/some/page.html')"> 
LinkyText 
</a> 

通常会做你认为它会。当然,问题在于'/some/page.html'最终会在搜索引擎中出现。你可以尝试做一些棘手的服务器端的事情(比如检查引用者并重定向回“主”页面),但我不相信这不是潘多拉的盒子。

希望有人会与解决这个问题的另一个答案一起。如果我想到什么,我会编辑这一个。

+0

我想如果我可以使用javascript在地址栏中更改网址而不重新加载页面,这将会容易得多。这样,当用户在'/ some/page'结束时,它就像正常一样,他们可以继续动态加载内容并相应地改变URL。也许我能做到这一点?另一个答案指出,我可以用'?c = content'部分来做到这一点,但是有没有办法通过整个URL来完成? – 2009-10-05 02:47:55

+0

这当然会容易得多,但据我所知,这是不可能完成的(我曾经仔细研究过它)。我想你可能会变得棘手,并在服务器端做一些事情,检查请求是否为XHR,如果不是,请将内容片段包装在完整导航中等。 – timdev 2009-10-05 02:59:52

+0

您可以轻松修改哈希,例如http://示例。 com /#page = music&order = popularit /或http://example.com/#music/popularity。只要看看Gmail的工作方式。当您使用哈希URL时,还有JS库支持浏览器历史导航。 – 2009-10-05 03:00:47

2

除了以前的答案。

您可以检查是否通过AJAX请求显示结果(即JSON数据如果AJAX,如果没有完整的HTML页面)。在PHP脚本检查看起来你正在使用的服务器端(拼音/ Python/ASP)

function isAjax() { 
     return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
     ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')); 
    } 

的技术肯定会有解决办法。

相关问题