REST / Ajax深层链接兼容性 - 锚标记与查询字符串

时间:2009-11-07 14:52:19

标签: html ajax http hyperlink

所以我正在开发一个网络应用,我想过滤搜索结果。

一个好的宁静实现可能如下所示:

1. mysite.com/clothes/men/hats+scarfs

但是我们想说我们想要过滤过滤器,就像酷孩子一样,我们希望保留深层链接,我们可能会使用锚标记并用Javascript解析它以显示正确的列表:

2. mysite.com/clothes#/men/hats+scarfs

但是,如果有人点击启用了JS的第一个链接,然后更改过滤器,我们可能会得到:

3. mysite.com/clothes/men/hats+scarfs#/women/shoes

的Urk。

同样,如果某人没有启用JS,并点击链接2 - JS将不会解析选项,并且不会显示正确的列表。

Ajax深层链接和非Ajax链接是否不兼容?看起来似乎是这样,因为服务器无法解析网址的#部分,因为它没有发送到服务器。

4 个答案:

答案 0 :(得分:1)

GoogleA proposal for making Ajax crawlable引发了一个关于这个问题的问题。 Google会在那里提供有关网址结构的建议,可能会为您提供自己的应用建议。

以下是摘录:

  

总之,从有状态开始   网址如   http://example.com/dictionary.html#AJAX   ,两者都可以使用   抓取工具和用户为   http://example.com/dictionary.html#!AJAX   可以被抓取为   http://example.com/dictionary.html?_escaped_fragment_=AJAX   反过来会向用户显示   并访问为   http://example.com/dictionary.html#!AJAX

查看Google's Presentation here(注意:google docs演示文稿)

总的来说,我认为完全关闭JavaScript和CSS并浏览您的网站和Web应用程序并查看最终会暴露的内容是有用的。一旦你了解了什么是可见的,你就会明白大多数搜索引擎看到了什么,反过来它会告诉你什么是什么,什么不是蜘蛛。

答案 1 :(得分:0)

如果您在启用JavaScript的情况下访问mysite.com/clothes/men/hats+scarfs,那么您的JavaScript应该自动将其重写为mysite.com/clothes#men/hats+scarfs - 当您点击过滤器时,它们应该由JavaScript控制意味着你只会更改主题标签而不是整个网址(因为你将会返回false)。

您遇到的问题是非JS用户访问启用了JS的深层链接,因为服务器无法确定这些内容。不幸的是,你唯一能做的就是带他们去mysite.com/clothes,让他们重新开始他们的旅程(据我所知)。你需要尝试确保当人们链接到网站时,他们使用硬编码的深层链接而不是散列的深层链接

答案 2 :(得分:0)

我建议不要使用查询字符串,因为您要将数据发送回服务器而与之前指定的目标没有直接关系。这是一个可以破坏的安全漏洞,因为可以手动将恶意代码添加到查询字符串中,从而在您的网络服务器上造成XSS或缓冲区溢出攻击。

我认为REST的目的是在没有查询字符串的情况下使用绝对URI,因为那时你只指定资源的位置,除了资源是如此平等的可能性之外,它是描述性和语义相关的位置相关。即使指定路径上没有资源,您仍然可以实例化一个可以相应处理的可能唯一且具有描述性的位置。

答案 3 :(得分:0)

通过深层链接进入网站的用户

如果您构建Ajax初始化代码,以便在过滤页面上输入网站的用户(例如/clothes/men/hats#women/shoes)被带到{{{},则可以避免无意义链接(如/clothes/women/shoes) 1}}页面在任何Ajax过滤发生之前。例如,您可能会执行以下操作(使用jQuery):

/clothes

没有JavaScript的用户

正如您在问题中所说,服务器无法了解网址片段,因此如果没有启用JavaScript的用户获得$("a.filter") .each(function() { var href = $(this).attr("href").replace("/clothes/", "/clothes#"); $(this).attr("href", href); }) .click(function() { update_filter($(this).attr("href").split("#")[1]); }); 的链接,则不会应用过滤。

但是,即使没有过滤,通过在/clothes#filter页面中使用过滤字符串作为ID,这些链接对于非JS用户也会更有意义。为了防止这种混乱的Ajax体验,在初始化Ajax链接之前,需要使用JavaScript更改ID(或删除元素)。

这有多实用取决于您拥有的类别数量以及/clothes页面包含的内容。