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上)单击F12或Rihgt鼠标和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成为了某种程度上的标准….