Facebook中的shebang / hashbang(#!)和新的Twitterurl是什么?

我刚刚注意到,我们现在习惯的漫长而复杂的Facebookurl现在看起来像这样:

http://www.facebook.com/example.profile#!/pages/Another-Page/123456789012345

据我记得,今年早些时候,这只是一个普通的URL片段式的string(以#开头),没有感叹号。 但现在它是一个shebang或hashbang( #! ),我以前只在shell脚本和Perl脚本中见过。

新的Twitterurl现在还具有#! 符号。 例如,Twitter个人资料url如下所示:

http://twitter.com/#!/BoltClock

#! 现在在URL中扮演一些特殊的angular色,比如某个Ajax框架或者其他东西,因为新的Facebook和Twitter界面现在已经基本上被Ajax化了。 在我的URL中使用这个会以任何方式使我的Web应用程序受益?

这种技术现在已经被弃用了 。

曾经告诉Google如何索引页面。

https://developers.google.com/webmasters/ajax-crawling/

这种技术已经被使用与HTML5一起引入的JavaScript历史API的能力所取代。 对于像www.example.com/ajax.html#!key=value这样的url,Google会检查urlwww.example.com/ajax.html?_escaped_fragment_=key=value以获取非AJAX版本的内容。

八脚形/数字符号/哈希标记在URL中具有特殊意义,它通常标识文档的一部分的名称。 精确的术语是散列之后的文本是URL的锚点部分。 如果您使用维基百科,您将看到大多数页面都有一个目录,您可以使用锚点跳转到文档中的各个部分,例如:

https://en.wikipedia.org/wiki/Alan_Turing#Early_computers_and_the_Turing_test

https://en.wikipedia.org/wiki/Alan_Turing标识页面, Early_computers_and_the_Turing_test是主页。 Facebook和其他JavaScript驱动的应用程序(比如我自己的Wood&Stones )使用锚点的原因是他们希望使页面成为书签(如对该答案的评论所build议的那样),或者支持后退button而无需从整个页面重新加载整个页面服务器

为了支持书签和后退button,您需要更改URL。 但是,如果将页面部分(如window.location = 'http://raganwald.com'; )更改为其他URL或不指定锚点,则浏览器将从URL中加载整个页面。 试试这在Firebug或Safari的Javascript控制台。 加载http://minimal-github.gilesb.com/raganwald 。 现在在Javascript控制台中input:

 window.location = 'http://minimal-github.gilesb.com/raganwald'; 

您将看到从服务器刷新页面。 现在键入:

 window.location = 'http://minimal-github.gilesb.com/raganwald#try_this'; 

啊哈! 没有页面刷新! types:

 window.location = 'http://minimal-github.gilesb.com/raganwald#and_this'; 

仍然没有刷新。 使用后退button查看这些URL在浏览器历史logging中。 浏览器注意到我们在同一页面上,但只是改变锚点,所以它不会重新加载。 由于这种行为,我们可以在浏览器中看到一个JavaScript应用程序在一个“页面”上,但是有许多可collections的部分,这些部分尊重后退button。 当用户input不同的“状态”时,应用程序必须更改锚点,同样,如果用户使用后退button或书签或链接加载包含锚点的应用程序,则应用程序必须恢复适当的状态。

所以你有它:锚为Javascript程序员提供了一个机制,使书签,索引,和后退button友好的应用程序。 这种技术有一个名字:它是一个单页面接口 。

ps这项技术还有第四个好处:通过AJAX加载页面内容,然后将其注入到当前的DOM中可以比加载新页面快得多。 除了提高速度外,还可以在程序员的控制下进行后台加载某些部分的技巧。

pps考虑到所有这些,'bang'或惊叹号是Google的networking爬虫的进一步提示,即可以从略微不同的URL从服务器加载完全相同的页面。 请参阅Ajax爬行 。 另一种技术是将每个链接指向服务器可访问的URL,然后使用不显眼的Javascript将其更改为具有锚点的SPI。

这是关键链接: 单页面接口宣言

首先:我是raganwald引用的The Single Page Interface Manifesto的作者

正如raganwald解释得非常好,FaceBook和Twitter中使用的单页面接口(SPI)方法的最重要的方面是在URL中使用散列#

人物! 只是为了Google的目的而添加的,这个符号是用于抓取AJAX网站(在极端单页面网站上)的Google“标准”。 当Google的抓取工具find#!的url时#! 它知道提供了相同的页面“状态”,但是在这种情况下在加载时间上存在替代的常规URL。

尽pipe#! 组合是非常有趣的search引擎优化,只有谷歌支持(据我所知),与一些JavaScript技巧,你可以build立SPI网站SEO兼容的任何networking爬虫(雅虎,冰…)。

SPI宣言和演示不使用Google的格式! 在散列表中,这个表示法可以很容易地添加,并且SPI抓取可能更容易(UPDATE:now!notation被使用并且与其他search引擎保持兼容)。

看看这个教程 ,是一个简单的ItsNat SPI站点的例子,但你可以select其他框架的一些想法,这个例子是SEO兼容的任何networking爬虫。

困难的问题是生成任何(或选定)的“AJAX页面状态”作为SEO的纯HTML,在ItsNat是非常容易和自动的,相同的网站是在同一时间SPI或页面基于search引擎优化(或当JavaScript被禁用为可访问性)。 与其他Web框架,你可以按照双站点的方法,一个网站是基于SPI和另一个基于SEO的页面,例如Twitter使用这种“双站点”技术。

如果你正在考虑采用这个hashbang约定,我会非常小心 。

一旦你做好了,你就不能回去了。 这可能是最棘手的问题。 Ben的文章提出了pushState被广泛采用的观点,我们可以放弃hashbangs并回到传统的URL。 那么事实是,你不能。 早些时候我说URL是永远的,它们被索引和存档,并且通常被保留。 补充一点,很酷的url不会改变。 我们不想断开与我们内容的所有有价值的链接。 如果你已经在任何时候实现了hashbang的URL,那么你想在不中断链接的情况下改变它们,唯一的办法就是在你的域的根文件上运行一些JavaScript。 永远。 这绝不是暂时的,你坚持着。

你真的想使用pushState而不是hashbangs ,因为使你的URL丑陋而且可能被破坏 – 永远是hashbangs的一个巨大而永久的缺点。

为了对此进行良好的后续处理,Twitter(hashbang URL和单页面接口的先驱之一)承认hashbang系统从长远来看是缓慢的,他们实际上已经开始反转决定,并返回旧学校的联系。

关于这个的文章就在这里。

我一直以为! 只是表示后面的哈希片段对应一个URL,用! 取代网站的根或域名。 理论上它可以是任何东西,但似乎Google AJAX Crawling API喜欢这种方式。

散列,当然,只是表明没有真正的页面重新加载正在发生,所以是的,这是为了AJAX的目的。 编辑:Raganwald做了一个可爱的工作更详细地解释这一点。

上面的答案很好地描述了为什么以及如何在Twitter和Facebook上使用它,我错过了解释什么#默认情况下…

在一个'正常'(而不是一个单一的页面应用程序),你可以做hash锚定与任何具有身份证的元素,通过哈希#

例:

(在Chrome上)单击F12Rihgt鼠标Inspect element

在这里输入图像描述

然后采取id="answer-10831233"并像以下添加到URL

https://stackoverflow.com/questions/3009380/whats-the-shebang-hashbang-in-facebook-and-new-twitter-urls-for#answer-10831233

你会得到一个链接跳转到页面上的元素

Facebook中的shebang / hashbang(#!)和新的Twitterurl是什么?

通过在上面的答案中描述的方式使用#你引入了冲突的行为…虽然我不会放松睡眠…自从Angular成为了某种程度上的标准….