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

Html REST/Ajax深度链接兼容性-锚定标记与查询字符串,html,ajax,http,hyperlink,Html,Ajax,Http,Hyperlink,所以我正在开发一个网络应用程序,我想过滤搜索结果 一个好的restful实现可能如下所示: 1. mysite.com/clothes/men/hats+scarfs 但是,假设我们想像酷酷的孩子们一样使用ajax进行过滤,并且我们想保留深度链接,我们可以使用锚定标记并用Javascript解析以显示正确的列表: 2. mysite.com/clothes#/men/hats+scarfs 但是,如果有人在启用JS的情况下单击第一个链接,然后更改过滤器,我们可能会得到: 3. mysite.

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

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

1. mysite.com/clothes/men/hats+scarfs
但是,假设我们想像酷酷的孩子们一样使用ajax进行过滤,并且我们想保留深度链接,我们可以使用锚定标记并用Javascript解析以显示正确的列表:

2. mysite.com/clothes#/men/hats+scarfs
但是,如果有人在启用JS的情况下单击第一个链接,然后更改过滤器,我们可能会得到:

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

类似地,如果有人没有启用JS,单击链接2-JS将不会解析选项,并且不会显示正确的列表


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

如果您在启用JavaScript的情况下访问mysite.com/costs/men/hats+scarfs,那么您的JavaScript应该自动将其重写为mysite.com/costs#men/hats+scarfs-当您单击过滤器时,它们应该由JavaScript控制,这意味着您将只更改hashtag而不是整个URL(因为您将返回false)


您遇到的问题是,对于非JS用户来说,由于服务器无法确定这些内容,他们将访问启用JS的深度链接。不幸的是,你唯一能做的就是把他们带到mysite.com/costs,让他们重新开始他们的旅程(据我所知)。您需要尝试并确保当人们链接到站点时,他们使用硬编码的deeplink,而不是散列的deeplink。我不建议使用查询字符串,因为您将数据发送回服务器时,与先前指定的目的地没有直接关联。这是一个可损坏的安全漏洞,因为恶意代码可以手动添加到查询字符串中,从而在Web服务器上造成XSS或缓冲区溢出攻击

我相信REST的目的是在不使用查询字符串的情况下使用绝对URI,因为您只指定了资源的一个位置,并且该位置是描述性的,并且在语义上是相关的,此外,资源也可能具有同等的相关性。即使在指定的路径上没有资源,您仍然实例化了一个可能唯一的描述性位置,可以相应地进行处理

用户通过深度链接进入网站 如果将Ajax初始化代码构建为在过滤页面(例如,
/counts/women/hats#women/shoes
)上进入站点的用户在进行任何Ajax过滤之前被带到
/counts
页面,则可以避免无意义的链接(如
/counts/hats
)。例如,您可以这样做(使用):

没有JavaScript的用户 正如您在问题中所说的,服务器无法了解URL片段,因此如果向未启用JavaScript的用户提供指向
/Cloth\filter
的链接,则不会对其应用过滤

然而,即使没有过滤,这些链接也可以通过在
/coots
页面中将过滤字符串用作ID而对非JS用户更有意义。为了避免这种对Ajax体验的干扰,在初始化Ajax链接之前,需要使用JavaScript更改ID(或删除元素)


这是否实用取决于您拥有多少类别以及您的
/Cloth
页面包含的内容

有人将Monkey扳手扔进了这个问题中:。谷歌正在为url结构提供建议,这可能会为你自己的应用程序提供一些想法

下面是wrapup:

总之,从一个有状态的 URL,例如
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

视图(注:谷歌文档演示文稿)


总的来说,我认为完全关闭JavaScript和CSS,浏览你的网站和web应用程序,看看最终会暴露什么是有用的。一旦你意识到了什么是可见的,你就会明白大多数搜索引擎看到了什么,而这反过来又会告诉你什么是和没有被破坏。

Javascript无法将地址从/costs/men/hats+围巾重写为/costs#men/hats+围巾-它只能影响到#部分。除非你指的是重定向,它会工作,但有点笨重-加载一个页面,然后重定向到相同的东西,但使用#语法。谢谢-是的,这会工作,但第一次过滤点击将是非ajax的,对吗?对于用户来说,第一次点击是非ajax的,而随后的点击是ajax可能会很奇怪。至于没有JS的用户,是的,我认为IDs可以使用更简单的界面。然而,这里有一个以上的过滤器尺寸,这将使得使用IDS非常棘手,第一次点击不是Ajax,这不是理想的。感谢链接-非常有用,而且很高兴知道谷歌认为这也是一个值得解决的问题。该网站完全可以在没有Javascript的情况下浏览——当URL从一个没有启用JS的系统存储并在一个启用JS的系统上使用时,问题就来了,反之亦然。我认为这个答案最有用,因为它提供了谷歌如何试图解决这个问题的有趣信息。我认为目前还没有一个理想的解决方案。Facebook实际上实现了这一点。例子:
$("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]);
  });