Для чого «shebang / hashbang» (#!) У Facebook та нові URL-адреси Twitter?


743

Я щойно помітив, що довгі звичні URL-адреси Facebook, до яких ми звикли зараз, виглядають так:

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

Наскільки я можу пригадати, на початку цього року це була лише звичайна URL-адреса, що нагадує фрагмент (починаючи з #), без знаків оклику. Але тепер це шебанг чи хешбанг ( #!), які я раніше бачив лише у скриптах оболонки та скриптах Perl.

У нових Twitter Тепер URL - адреса також має ті #!символи. Наприклад, URL-адреса профілю Twitter, наприклад, виглядає так:

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

Чи #!відіграє зараз якусь особливу роль у URL-адресах, як-от для певної рамки Ajax чи щось подібне, оскільки нові інтерфейси Facebook і Twitter значною мірою відмінені?
Чи використовує це в моїх URL-адресах будь-яким чином користь моїй веб-програмі?


130
Хм. Довелося шукати, що shebangбуло ... en.wikipedia.org/wiki/Shebang_%28Unix%29
JYelton

32
FWIW, це не просто сценарії оболонки та perl, а будь-який скрипт, що працює в системі Unix. #! рядок повідомляє оболонці, що таке перекладач для цього сценарію ... звичайно, мій коментар не має нічого спільного з facebook або twitter
bluesmoon

3
Дякую, Hacker News! (залишаючи коментар, щоб я не стикався з питанням, не бачив необхідності)
BoltClock

15
Хешбанг прославляється з усіх неправильних причин, він порушує кращі практики та знищує шанс на прогресивне посилення та витончену деградацію. Будь ласка, використовуйте інші рішення там.
balupton

2
Зауважте, що в жовтні 2015 року компанія Google застаріла з хешбангом, яку вони представили у 2009 році ! Тож для нових додатків вам більше не потрібно робити цього для SEO. Зараз у верхній частині специфікацій Google є лише найтонше зауваження білого кольору: "Ця рекомендація офіційно застаріла з жовтня 2015 року."
Барт

Відповіді:


483

Зараз ця техніка застаріла .

Це використовується , щоб повідомити Google , як індексувати сторінку.

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

Ця методика в основному була витіснена можливістю використання API історії JavaScript, який був введений поряд з HTML5. Для такої URL-адреси www.example.com/ajax.html#!key=valueGoogle перевірить URL-адресу, www.example.com/ajax.html?_escaped_fragment_=key=valueщоб отримати вміст, що не є AJAX.


16
Ви впевнені, що це все є? Я часто виявляю, що завантаження сторінки висить на URL-адресі shebang у фейсбуці (навіть після багатьох перезавантажень), але якщо ви видалите #! Вручну, це працює. Не кажучи вже про те, що ви часто отримуєте "1,5 URL-адреси" (тобто стара URL-адреса залишається і до неї додається лише нова частина (наприклад, photo.php? Id = ... двічі, але з різними ідентифікаторами). Не кажучи вже про це " #! "також додається до URL-адрес електронної пошти у Facebook, які, ймовірно, не можуть (і не повинні бути) піддаються індексації. У будь-якому випадку, я вважаю, що шебанг надзвичайно дратівливий, оскільки, здається, це причина стільки помилок сторінки на моєму повільному домашня лінія.
Педері

11
Те, що у Facebook є помилки, не робить цих помилок виною двох символів в URL. Якщо сайт кодується належним чином, щоб зрозуміти та генерувати їх, URL-адреси AJAX, які можна сканувати, досить зручні. Багато інших речей у Facebook теж випадають.
ceejayoz

15
@Pedery: Я лише коли-небудь бачив цю проблему з Facebook. Я погоджуюсь, він весь час підводить мене до стіни (не у Facebook).
BoltClock

5
Що стосується пошукових систем, що мають индексируемая URL AJAX робить сторінку індексується більше , ніж має индексируемая НЕ URL AJAX робить. Facebook використовує цей формат URL для більшої користі від Google - він також робить сторінки, доступними через AJAX на Facebook, закладними, коли їх інакше не було б.
ceejayoz

13
Про деякі цікаві застереження також прочитайте цю статтю: isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs
Michael

215

Октоторп / знак-знак / хешмак має особливе значення в 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-адреси. Спробуйте це в консолі Javascript Firebug або Safari. Навантаження 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-адреси є в історії веб-переглядачів. Браузер помічає, що ми знаходимося на одній сторінці, але просто змінюємо якір, щоб він не перезавантажувався. Завдяки такій поведінці ми можемо мати єдину програму Javascript, яка, як видається, у браузері знаходиться на одній «сторінці», але має багато розділів, що відзначають закладки, які поважають кнопку «назад». Програма повинна змінити якір, коли користувач вводить різні "стани", і якщо користувач використовує кнопку "назад" або закладку або посилання для завантаження програми з доданим якорем, програма повинна відновити відповідний стан.

Отож, у вас це є: якір надає програмістам Javascript механізм створення додатків, що дозволяють використовувати закладки, що індексуються та зворотних кнопок. Ця методика має назву: це інтерфейс однієї сторінки .

ps Існує четверта перевага цієї методики: Завантаження вмісту сторінки через AJAX та введення її в поточний DOM може бути набагато швидшим, ніж завантаження нової сторінки. Окрім збільшення швидкості, під контролем програміста можна виконувати подальші фокуси, такі як завантаження певних ділянок у фоновому режимі.

pps Враховуючи все це, "удар" або знак оклику - це ще один натяк веб-сканеру Google про те, що таку саму сторінку можна завантажити з сервера за дещо іншою URL-адресою. Дивіться повзання Ajax . Інша методика полягає в тому, щоб зробити кожну точку посилання на доступну серверу URL-адресу, а потім використовувати ненав’язливий Javascript, щоб змінити його на SPI з якорем.

Ось ще ключове посилання: Маніфест інтерфейсу єдиної сторінки


14
"Однак додаток без цієї оптимізації все ще сканується, якщо веб-сканер хоче його індексувати." Не зовсім. Хеш не надсилається на сервер.
Кріс Бродфут

7
лише для інформації: self.document.location.hashнадає значення цього хешу
Кевін

12
Хеш не надсилається на сервер. Гарний улов!
raganwald

36
Ця вся відповідь окрім одно абзацу "pps" є зайвим.
Гонки легкості на орбіті

21
@imaginonic: Я спізнююся, але відмінно оброблений , як це, 90% з них не торкнутися #!аспекту мого питання взагалі . Тому він сказав, що це зайве. Кількість оновлень тут, ймовірно, пов’язана з великим трафіком, коли на моє запитання потрапило до Hacker News у поєднанні з самою довжиною цієї відповіді.
BoltClock

111

Перш за все: я автор "Маніфесту єдиної сторінки з інтерфейсом", цитованого Раганвальдом

Як дуже добре пояснив raganwald, найважливішим аспектом підходу Single Page Interface (SPI), який використовується у FaceBook та Twitter, є використання хешу #в URL-адресах

Символ !додається лише для цілей Google, це позначення є "стандартом" Google для сканування веб-сайтів, що інтенсивно працюють на AJAX (у крайніх веб-сайтах інтерфейсу однієї сторінки). Коли сканер Google знаходить URL-адресу, #!він знає, що існує альтернативна звичайна URL-адреса, що забезпечує ту саму сторінку "state", але в цьому випадку під час завантаження.

Незважаючи на #!комбінацію, це дуже цікаво для SEO, підтримується лише Google (наскільки я знаю), за допомогою деяких хитрощів JavaScript ви можете створити веб-сайти SPI SEO, сумісні для будь-якого веб-сканера (Yahoo, Bing ...).

Маніфест SPI і демонстрації не використовують формат Google !у хешах, це позначення можна легко додати, а сканування SPI може бути ще простіше (ОНОВЛЕНО: зараз! Нотація використовується і залишається сумісною з іншими пошуковими системами).

Погляньте на цей підручник , це приклад простого сайту ItsNat SPI, але ви можете вибрати деякі ідеї для інших фреймворків. Цей приклад є SEO сумісним для будь-якого веб-сканера.

Важка проблема полягає в створенні будь-якого (або вибраного) "стану сторінки AJAX" як простого HTML для SEO, в ItsNat це дуже просто і автоматично, той самий сайт знаходиться в той же час SPI або сторінка для SEO (або коли JavaScript відключений для доступності). З іншими веб-рамками ви завжди можете дотримуватися подвійного підходу до веб-сайту, один сайт заснований на SPI, а інший на основі SEO, наприклад, Twitter використовує цю техніку "подвійний сайт".


3
Що щодо принципу прогресивного вдосконалення? Веб-сайт не повинен виходити з ладу через відключений JavaScript. І повірте, JavaScript відключений не лише у застарілих браузерах, але й у багатьох користувачів, які знають безпеку, які не люблять виконувати випадкові JS.
Роман Ройтер

88

Я був би дуже обережним, якщо ви розглядаєте можливість прийняти цю конвенцію про хешбанг.

Отримавши хешбанг, ти вже не можеш повернутися. Це, мабуть, найголовніше питання. У посту Бен висунуто, що коли pushState більш широко прийнятий, ми можемо залишити хеш-баги позаду і повернутися до традиційних URL-адрес. Ну, насправді, ви не можете. Раніше я заявляв, що URL-адреси є назавжди, вони індексуються та архівуються і, як правило, зберігаються навколо. Щоб додати до цього, круті URL-адреси не змінюються. Ми не хочемо відключати себе від усіх цінних посилань на наш вміст. Якщо ви реалізували URL-адреси хешбангу в будь-який момент, тоді хочете змінити їх, не порушуючи посилання, єдиний спосіб це зробити, запустівши деякий JavaScript у кореневому документі вашого домену. Назавжди. Це жодним чином не тимчасове, ви до цього застрягли.

Ви дійсно хочете використовувати pushState замість хешбагів , тому що зробити ваші URL-адреси некрасивими та, можливо, зламаними - назавжди - це колосальний та постійний недолік хеш-багів.


Я думаю, що ваша критика щодо хеш-багів справедлива, але використання просто pushState як замінника означає, що ми втратимо можливість завантажувати вміст у межах однієї сторінки на основі URL-адреси. Тоді URL-адреси не можна ділитися.
Лука

У мене була аналогічна проблема в моїй роботі - ми використовували Page.js (який використовує pushState) для навігації на одній сторінці, де раніше ми використовували Hasher та Crossroads (хеш-базінг). Як результат, нам потрібно було рятувати такі шляхи /blah#foo/feep/baz?stuff=nonsense. Новий еквівалент шляху буде /blah/foo/feep/baz?stuff=nonsense(примітка # замінена на /). Я зробив це просто, маючи в моєму налаштуванні маршрут, який зафіксував /blahі перевірив, чи є він, якщо так, додаючи вміст хеша після косої риски. Врятували.
Герт Шондербі

16

Щоб добре прослідкувати все це, Twitter - один із піонерів URL-адреси хашбанга та односторінкового інтерфейсу - визнав, що система хешбангу була повільною в довгостроковій перспективі, і вони насправді почали змінювати рішення і повертатися до старі шкільні посилання.

Стаття про це тут.


9

Я завжди вважав, що !щойно вказано, що фрагмент хешу, який слідував, відповідає URL-адресі, !займаючи місце кореня сайту або домен. Теоретично це може бути що завгодно, але, схоже, Google AJAX Crawling API так подобається.

Звичайно, хеш просто вказує на те, що не відбувається реального перезавантаження сторінки, так що так, це для AJAX. Редагувати: Раганвальд робить чудову роботу, пояснюючи це більш детально.


-2

Відповіді вище добре описують, чому і як це використовується у Twitter і facebook, що я пропустив - це пояснення, що #робить за замовчуванням ...

У "звичайному" (не на одній програмі сторінки) ви можете зробити прив’язку hashдо будь-якого елемента, який має ідентифікатор, помістивши цей елемент id в URL після хеша#

Приклад:

(на 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

і ви отримаєте посилання, яке переходить на цей елемент на сторінці

Для чого «shebang / hashbang» (#!) У Facebook та нові URL-адреси Twitter?

Використовуючи #спосіб, описаний у відповідях вище, ви вводите суперечливу поведінку ... хоча я б не втрачав сон над нею ... оскільки Кутовий став дещо стандартним ....


2
Відповідь raganwald містить пояснення, які ви сказали, що пропустили. Тим не менш, я не бачу, як питання отримує користь з підручника про те, як працює # - питання передбачає, що читач уже знайомий з фрагментами URL-адрес, і ця функція тут взагалі не актуальна, крім вашого зауваження про конфліктну поведінку .
BoltClock

@BoltClock Привіт BoltClock, але не пояснюючи, що таке поведінка за замовчуванням, кажучи, що "це буде конфлікт", не дає читачеві уявлення про те, про що йде мова, який функціонал потенційно втрачається ... Мені просто подобається давати приємні відповіді з фотографіями, якщо Я бачу, що чогось не вистачає настільки повно, як я можу їх зробити ...
Matas Vaitkevicius
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.