关于http:?和#1

'?' versus '#!' in URLs

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What's the shebang (#!) in Facebook and new Twitter URLs for?

为什么有越来越多的网站(例如Twitter或GoWKER)使用"!"而不是"?"要将参数与URL的其余部分分开吗?优势是什么?


这正成为谷歌提出的让Ajax Web应用程序可以爬行的标准方法。


"?"用于将URL的路径组件与查询组件分离。当浏览器请求这样的资源时,两个组件都会发送到Web服务器。服务器可以查看查询并确定要发送回的响应。

""的用法不同——它将"fragment"或"hash"组件与URL的其余部分分开。片段组件从未发送到Web服务器,但它可用于页面中运行的任何脚本。

比较两个URL,比如

1
http://www.example.com/service/?my+query

1
http://www.example.com/service/#!my+query

在第一种情况下,整个URL被发送到服务器,并返回响应。一路从浏览器到服务器的任何缓存都将看到查询字符串,并知道响应只与该查询相关。它们可以缓存对该查询的响应,但更可能根本不会缓存响应。

这个方案意味着,如果ExpLo.com是一个流行的服务,他们将不得不对服务的每一个用户发送一个完整的响应,并且很有可能他们的任何结果都不会被缓存在任何地方。

在第二种情况下,只使用路径组件http://www.example.com/service/,服务器将(可能)向请求该URL的每个用户返回相同的文档。上游缓存将能够缓存该文档,并将其提供给新用户,而不必为每个请求返回原始Web服务器。

使用这个方案,可能会有一些javascript运行在该文档上,它查看片段,然后从服务请求任何额外的搜索结果。这些页面可能比整个页面小得多,从而减少了服务器上的负载,或者它们可能是可缓存的结果,可供多个用户使用。

具体形式,"!",是Ajax风格的Web应用程序的一个新兴标准,因此它们的URL可以被搜索引擎索引,也可以通过Web分析软件进行分析。实际的URL规范只要求使用""字符,它也可以用于其他目的(如文档中的命名锚)。


在构建Ajax重站点时,使用磅符号非常方便。显示新内容而不重新加载页面的网站通常仍会更新URL,以便链接特定内容。您只能在不重新加载页面的情况下更改""之后的URL部分(以防止网站假装他们生活在与他们不同的域中)。