Facebookのシバン/ハッシュバング(#!)と新しいTwitterのURLは何ですか?


743

私たちが慣れ親しんでいる、長く複雑なFacebookのURLが次のようになっていることに気づきました。

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

私が思い出せる限り、今年の初め#は感嘆符のない通常のURLフラグメントのような文字列(で始まる)でした。しかし、今ではシバンまたはハッシュバン(#!)になっています。これは、以前はシェルスクリプトとPerlスクリプトでしか見られなかったものです。

新しいTwitterの URLは今も備えています#!シンボルを。たとえば、TwitterプロフィールのURLは次のようになります。

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

ない#!新しいFacebookやTwitterのインターフェイスは現在、主にAjaxifiedされているので、今、特定のAjaxフレームワークや何かのためのように、URL内のいくつかの特別な役割を果たしていますか?
これをURLで使用すると、Webアプリケーションに何らかの利点がありますか?


130
うーん。何shebangだったか調べなければならなかった... en.wikipedia.org/wiki/Shebang_%28Unix%29
JYelton

32
FWIW、それはシェルとperlスクリプトだけでなく、UNIXのようなシステムで実行されるスクリプトです。#!行は、そのスクリプトのインタープリターが何であるかをシェルに伝えます...もちろん、私のコメントは、facebookやtwitterとは関係ありません
bluesmoon

3
ありがとう、ハッカーニュース!(コメントとして残すので、質問をぶつけたり、必要性を見たりしません)
BoltClock

15
ハッシュバンは、すべての誤った理由で栄光を放ち、ベストプラクティスを破り、漸進的な強化と優雅な低下の可能性を破壊します。そこにある他のソリューションを使用してください。
balupton 2011年

2
2015年10月、Google は2009年に導入たハッシュバン廃止したことに注意してください。新しいアプリケーションの場合、SEOのためにこれを行う必要はありません。現在のところ、Googleの仕様ページの上部にある白の微妙なコメントは次のとおりです。「この推奨事項は、2015年10月に正式に廃止されました。」
Bart

回答:


483

この手法は現在推奨されていません

これは、ページのインデックス作成方法をGoogle 指示するために使用されていました。

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

この手法は、HTML5とともに導入されたJavaScript History APIを使用する機能に取って代わられました。のようなURLの場合www.example.com/ajax.html#!key=value、GoogleはURL www.example.com/ajax.html?_escaped_fragment_=key=valueをチェックして、コンテンツの非AJAXバージョンをフェッチします。


16
それで終わりです。ページの読み込みがFacebookのシバンURLでハングすることがよくあります(何度もリロードした後でも)が、手動で#!を削除すると機能します。言うまでもありません。「1.5のURL」(つまり、古いURLのままとなり、それに追加された新しい部分を持っている(すなわちphoto.php?ID = ...二回が、異なるIDを持つ)を取得頻繁にあなたを未言及する」こと#! "はfacebook-mail URLsにも追加されますが、これはおそらくインデックスに登録できません(また、そうすべきではありません)。いずれにせよ、シバンは非常に多くのページフォールトの原因であると思われるため、非常に不快です。ホームライン。
Pedery

11
Facebookにバグがあるということは、それらのバグがURLの2文字の誤りであるとは限りません。サイトを正しくコード化してそれらを理解および生成する場合、クロール可能なAJAX URLは非常に便利です。Facebookの他にもたくさんの不具合があります。
ceejayoz

15
@Pedery:私はこれまでFacebookでこの問題を見たことがあります。私は同意します、それは私を(Facebook以外の)壁にいつも追いやります。
BoltClock

5
検索エンジンに関しては、インデックス可能なAJAX URLがあっても、インデックス可能な AJAX URLがあるよりも、ページにインデックスが作成されることはありません。FacebookはこのURL形式を使用して、Googleの利点だけでなく、FacebookでAJAXを介してアクセスしたページをブックマークできるようにします。
ceejayoz

13
いくつかの興味深い警告については、次の記事もお読みください:isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs
Michael Stum

215

octothorpe / number-sign / hashmarkは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など)がアンカーを使用する理由は、ページをブックマーク可能に(その回答に関するコメントで示唆されているように)したり、ページ全体をサーバー

ブックマークと戻るボタンをサポートするには、URLを変更する必要があります。ただし、ページの部分(などwindow.location = 'http://raganwald.com';)を別のURLに変更したり、アンカーを指定しない場合、ブラウザはURLからページ全体をロードします。FirebugまたはSafariのJavaScriptコンソールでこれを試してください。をロードしhttp://minimal-github.gilesb.com/raganwaldます。次に、JavaScriptコンソールで次のように入力します。

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

サーバーからページが更新されます。今タイプ:

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

ああ!ページの更新はありません。タイプ:

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

まだ更新されていません。[戻る]ボタンを使用して、これらのURLがブラウザの履歴にあることを確認してください。ブラウザは同じページにいることを認識していますが、アンカーを変更しているだけなので、リロードされません。この動作のおかげで、ブラウザからは1つの「ページ」上にあるように見える単一のJavaScriptアプリケーションを作成できますが、「戻る」ボタンを尊重するブックマーク可能なセクションが多数あります。ユーザーが異なる「状態」を入力すると、アプリケーションはアンカーを変更する必要があります。同様に、ユーザーが戻るボタン、ブックマーク、またはリンクを使用してアンカーを含むアプリケーションをロードした場合、アプリケーションは適切な状態を復元する必要があります。

アンカーは、JavaScriptプログラマーに、ブックマーク可能、インデックス付け可能、戻るボタンに対応したアプリケーションを作成するためのメカニズムを提供します。この手法には名前があります。これは、単一ページインターフェイスです。

psこの手法には4番目の利点があります。AJAXを介してページコンテンツを読み込んでから現在のDOMに挿入する方が、新しいページを読み込むよりもはるかに高速です。速度の増加に加えて、バックグラウンドで特定の部分をロードするなどのトリックは、プログラマーの制御下で実行できます。

ppsこれらすべてを踏まえると、「bang」または感嘆符は、まったく同じページをサーバーからわずかに異なるURLでロードできるというGoogleのWebクローラーへのさらなるヒントです。Ajax Crawlingを参照してください。別の手法は、各リンクがサーバーからアクセス可能なURLを指すようにし、次に控えめなJavaScriptを使用して、それをアンカー付きのSPIに変更することです。

ここでも重要なリンクです:シングルページインターフェイスマニフェスト


14
「しかし、この最適化のないアプリケーションは、Webクローラーがインデックスを作成したい場合でもクロール可能です。」あんまり。ハッシュはサーバーに送信されません。
Chris Broadfoot、

7
情報self.document.location.hash提供のみ:このハッシュの値を提供
Kevin

12
ハッシュはサーバーに送信されません。良いキャッチ!
raganwald

36
単一段落の「pps」を除いて、この全体の答えは冗長です。
オービットのライトネスレース2011年

21
@imaginonic:私は後半だけど、そのまま完全に作られたとして、それの90%は上で触れていない#!私の質問の側面すべてに。それが彼がそれが冗長であると言った理由です。ここでの賛成票の数は、私の質問がハッカーニュースに到達したときのトラフィックの多さと、この回答の完全な長さだけが関係している可能性があります。
BoltClock

111

まず第一に、私はraganwaldが引用したThe Single Page Interface Manifestoの作者です

raganwaldが非常によく説明したように、FaceBookとTwitterで使用されているシングルページインターフェイス(SPI)アプローチの最も重要な側面は、#URL でのハッシュの使用です。

この文字!はGoogleの目的でのみ追加されます。この表記は、Ajaxが集中しているWebサイト(極端なシングルページインターフェイスWebサイト)をクロールするためのGoogleの「標準」です。GoogleのクローラーがURLを検出#!すると、同じページの「状態」を提供する別の従来のURLが存在することを認識しますが、この場合は読み込み時です。

#!組み合わせにもかかわらず、SEOにとって非常に興味深いものであり、Googleでのみサポートされています(私の知る限り)。JavaScriptトリックを使用して、任意のWebクローラー(Yahoo、Bing ...)と互換性のあるSPI WebサイトSEOを構築できます。

SPIマニフェストとデモでは!、ハッシュ形式のGoogleの形式を使用していないため、この表記を簡単に追加でき、SPIクロールがさらに簡単になります(更新:表記が使用され、他の検索エンジンとの互換性が維持されます)。

このチュートリアルをご覧ください。これはシンプルなItsNat SPIサイトの例ですが、他のフレームワークについていくつかのアイデアを選ぶことができます。この例は、どのWebクローラーでもSEO互換です。

難しい問題は、任意の(または選択された)「AJAXページ状態」をSEOのプレーンHTMLとして生成することです。ItsNatは非常に簡単かつ自動で、同じサイトが同時にSPIまたはSEOベースのページにあります(またはJavaScriptが無効になっている場合)アクセシビリティのため)。他のWebフレームワークでは、ダブルサイトアプローチに従うことができます。1つのサイトはSPIベースで、別のページはSEOベースです。たとえば、Twitterはこの「ダブルサイト」手法を使用しています。


3
プログレッシブエンハンスメントの原理はどうですか?JavaScriptが無効になっているため、ウェブサイトがクラッシュすることはありません。そして私を信じて、javascriptは古いブラウザだけでなく、ランダムなJSの実行を好まない多くのセキュリティ認識ユーザーによっても無効にされています。
ローマンロイター、2011年

88

このハッシュバン規則の採用を検討している場合は、非常に注意が必要です。

一度ハッシュバングすると、戻ることはできません。これはおそらく最も厄介な問題です。ベンの投稿は、pushStateがより広く採用されれば、ハッシュバングを残して従来のURLに戻ることができるという点を提唱しました。まあ、実際には、それはできません。先ほど、URLは永久に存在するものであると述べましたが、URLはインデックスに登録されてアーカイブされ、通常は保持されます。さらに、クールなURLは変更されません。私たちは、コンテンツへのすべての貴重なリンクから切り離されたくありません。いつでもハッシュバングURLを実装している場合、リンクを壊さずにURLを変更したいのは、ドメインのルートドキュメントでJavaScriptを実行することだけです。永遠に。それは決して一時的なものではなく、行き詰まっています。

あなたは本当にあなたのhashbangsの代わりにpushState使いたいのです。なぜなら、あなたのURLを醜くそしておそらく壊す-永遠に-は、ハッシュバングの巨大で永久的な欠点です。


ハッシュバングについてのあなたの批判は妥当だと思いますが、代わりにpushStateだけを使用すると、URLに基​​づいて単一ページアプリ内のコンテンツを読み込むことができなくなります。したがって、URLは共有できません。
ルーク、

私の仕事でも同様の問題がありました-以前はHasherとCrossroads(ハッシュでバッシング)を使用していた単一ページのナビゲーションにPage.js(pushStateを使用)を使用することにしました。その結果、のようなパスを救済する必要がありました/blah#foo/feep/baz?stuff=nonsense。同等の新しいパスは次のようになります/blah/foo/feep/baz?stuff=nonsense(注#は/に置き換えられます)。私は、セットアップにルートがあり、ルートがある/blahかどうかを確認するルートを持っているだけでそれを行いました。救出された。
GertSønderby15年

16

これらすべてについて適切なフォローアップを行うために、ハッシュバングURLとシングルページインターフェイスのパイオニアの1人であるTwitterは、ハッシュバングシステムが長期的には低速であり、実際に決定を覆し、古い学校のリンク。

これに関する記事はこちらです。


9

私は常に、サイトのルートまたはドメインに代わって、!続くハッシュフラグメントがURLに対応していることを示していたと想定し!ていました。理論的には何でもかまいませんが、Google AJAXクロールAPIはこの方法で気に入っているようです。

もちろん、ハッシュは実際のページのリロードが発生していないことを示しているだけなので、AJAXの目的のためです。編集:Raganwaldはこれをより詳細に説明する素敵な仕事をしています。


-2

上記の回答は、TwitterやFacebookで使用される理由と使用方法をよく説明して#います。

「通常の」(単一ページのアプリケーションではない)hashでは、ハッシュの後に要素IDをURLに配置することで、IDを持つ任意の要素にアンカーできます。#

例:

(Chromeの場合)F12またはまたはRihgt MouseをクリックしますInspect element

ここに画像の説明を入力してください

次に、id="answer-10831233"次のようにURLに追加します

/programming/3009380/whats-the-shebang-hashbang-in-facebook-and-new-twitter-urls-for#answer-10831233

ページのその要素にジャンプするリンクが表示されます

Facebookのシバン/ハッシュバング(#!)と新しいTwitterのURLは何ですか?

#上記の回答で説明されている方法で使用すると、競合する動作が導入されます...私はその上で睡眠を失うことはありませんが... Angularはやや標準になったので...


2
raganwaldの回答には、あなたが見逃したと言った説明が含まれています。それでも、質問がどのように機能するかについてのチュートリアルからどのように役立つかはわかりません-質問は、読者がURLフラグメントにすでに精通していることを前提としおり、その機能は、競合する動作についてのあなたのコメントを除いて、ここでは実際にはあまり関係ありません。 。
BoltClock

@BoltClockこんにちはBoltClockですが、「競合する」というデフォルトの動作を説明しないと、何が問題になっているのか、どのような機能が失われる可能性があるのか​​を読者に知らせません...私はそれらを作ることができるのと同じくらい完全な何かが欠けているのが
わかり
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.