Для чего нужен шебанг / хэшбанг (#!) В Facebook и новые URL-адреса Twitter?

Я только что заметил, что длинные, запутанные URL-адреса Facebook, к которым мы привыкли, выглядят так:

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

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

новые URL-адреса Twitter теперь также содержат символы #!. Например, URL-адрес профиля Twitter теперь выглядит так:

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

Играет ли #! теперь какую-то особую роль в URL-адресах, например, для определенной структуры Ajax или чего-то еще, поскольку новые интерфейсы Facebook и Twitter теперь в значительной степени Ajaxified?
Будет ли использование этого в моих URL-адресах как-то полезно для моего веб-приложения?


person BoltClock    schedule 09.06.2010    source источник
comment
Хм. Пришлось посмотреть, что такое shebang ... en.wikipedia.org/wiki/Shebang_% 28Unix% 29   -  person JYelton    schedule 09.06.2010
comment
Вот почему я озадачен тем, что он делает в URL-адресе Facebook.   -  person BoltClock    schedule 09.06.2010
comment
FWIW, это не только сценарии оболочки и Perl, но и любой сценарий, запускаемый в системе, подобной unix. #! строка сообщает оболочке, что такое интерпретатор для этого сценария ... конечно, мой комментарий не имеет ничего общего с facebook или twitter   -  person bluesmoon    schedule 17.10.2010
comment
Спасибо, Hacker News! (оставляю как комментарий, чтобы я не задавал свой вопрос , не вижу необходимости)   -  person BoltClock    schedule 17.10.2010
comment
Хэшбэнг прославляется по всем неправильным причинам, он нарушает лучшие практики и уничтожает шанс для прогрессивного улучшения и изящной деградации. Используйте другие существующие решения.   -  person balupton    schedule 07.03.2011
comment
Обратите внимание, что в октябре 2015 года Google устарел хэшбанг они представили в 2009 году! Так что для новых приложений вам больше не нужно делать это для SEO. Прямо сейчас есть только тонкое замечание белым цветом в верхней части страниц спецификаций Google: эта рекомендация официально устарела с октября 2015 года.   -  person Bart    schedule 14.11.2015


Ответы (7)


Этот метод устарел.

Это используется для указания Google, как индексировать страницу.

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

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

person ceejayoz    schedule 09.06.2010
comment
Ах, не знаю, как я это пропустил; похоже, что он существует довольно давно. Спасибо! - person BoltClock; 10.06.2010
comment
Вы уверены, что это все? Я часто обнаруживаю, что загрузка страницы зависает на URL-адресе shebang в facebook (даже после многих перезагрузок), но если вы вручную удалите # !, это сработает. Не говоря уже о, вы часто получаете 1,5 URL-адреса (т. е. старый URL-адрес остается, и к нему просто добавляется новая часть (например, photo.php? id = ... дважды, но с разными идентификаторами). Не говоря уже о, что #! также добавляется к URL-адресам электронной почты facebook, которые, вероятно, не индексируются (и не должны быть). В любом случае я нахожу shebang чрезвычайно раздражает, потому что это, кажется, причина стольких ошибок страниц на моей медленной домашней линии. - person Pedery; 15.10.2010
comment
То, что у Facebook есть ошибки, не означает, что эти ошибки связаны с двумя символами в URL-адресе. Если сайт правильно закодирован, чтобы понимать и генерировать их, сканируемые URL-адреса AJAX очень удобны. Многие другие вещи на Facebook тоже выходят из строя. - person ceejayoz; 15.10.2010
comment
@Pedery: Я видел эту проблему только в Facebook. Я согласен, это все время заставляет меня взлетать (не на Facebook). - person BoltClock; 15.10.2010
comment
Старый URL-адрес часто остается, потому что Facebook обрабатывает первоначальный запрос по этому URL-адресу (например, фотографию), но последующая навигация обрабатывается на той же странице через AJAX. Итак, вы можете просматривать профиль на странице с URL-адресом photo.php, но это потому, что вы щелкнули мышью. - person ceejayoz; 15.10.2010
comment
Что касается поисковых систем, наличие индексируемого URL-адреса AJAX не приводит к индексации страницы больше, чем индексируемый URL-адрес без AJAX. Facebook использует этот формат URL не только для выгоды Google - он также делает страницы, доступные через AJAX в Facebook, закладками, хотя в противном случае они не были бы таковыми. - person ceejayoz; 15.10.2010
comment
Экранированные фрагменты - отличная идея (см. mambopics.com), но, по крайней мере, до Bing (и Facebook - forum.developers.facebook.net/viewtopic.php?id=63698) реализует его. , Я думаю, что будет меньше принятия, поскольку всем придется использовать какую-то систему двойных URL-адресов; хэш-адрес для Google и еще один для Bing (и других). - person Amir; 17.10.2010
comment
Для некоторых интересных предостережений прочтите также эту статью: isolani.co.uk/blog/javascript/ BreakingTheWebWithHashBangs - person Michael Stum; 13.02.2011
comment
Хэшбэнг прославляется по всем неправильным причинам, он нарушает лучшие практики и уничтожает шанс для прогрессивного улучшения и изящной деградации. Воспользуйтесь другими существующими решениями. - person balupton; 07.03.2011
comment
Как верхний + принятый ответ, я думаю, что было бы целесообразно обновить его чем-то большим, чем просто ссылкой. - person dayuloli; 16.01.2015
comment
С 14 октября 2015 г. Google не поддерживает этот метод: googlewebmastercentral.blogspot.com/2015/10/ - person Trenton; 15.12.2015

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-адреса. Попробуйте это в консоли 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 механизм для создания приложений с возможностью добавления закладок, индексации и обратной кнопки. У этого метода есть название: это одностраничный интерфейс.

p.s. У этого метода есть четвертое преимущество: загрузка содержимого страницы через AJAX с последующим его внедрением в текущую модель DOM может быть намного быстрее, чем загрузка новой страницы. Помимо увеличения скорости, под контролем программиста могут выполняться дополнительные трюки, такие как загрузка определенных частей в фоновом режиме.

p.p.s. Учитывая все это, восклицательный знак или восклицательный знак - это еще один намек для поискового робота Google на то, что одна и та же страница может быть загружена с сервера по немного другому URL-адресу. См. Сканирование Ajax. Другой способ - сделать так, чтобы каждая ссылка указывала на URL-адрес, доступный серверу, а затем использовать ненавязчивый Javascript, чтобы преобразовать его в SPI с привязкой.

Вот снова ключевая ссылка: Манифест одностраничного интерфейса

person raganwald    schedule 16.10.2010
comment
Однако приложение без этой оптимизации все равно можно сканировать, если поисковый робот желает его проиндексировать. Не совсем. Хэш не отправляется на сервер. - person Chris Broadfoot; 17.10.2010
comment
просто для информации: self.document.location.hash предоставляет значение этого хеша - person Kevin; 17.10.2010
comment
Хэш не отправляется на сервер. Хороший улов! - person raganwald; 17.10.2010
comment
К сожалению, хэш, отправляемый на сервер, не зависит от клиента. Допустим, Google не может в настоящее время отправлять хэш на сервер, и я был бы удивлен, если бы это было сделано, но некоторые вещи (и некоторые клиенты) все равно могут отправлять # часть. (Так же, как некоторые веб-клиенты разрешают часть ../../ URL-адресов на стороне клиента, а другие отправляют их на веб-сервер как есть) - person Kent Fredric; 27.10.2010
comment
и даже если хэш не может быть отправлен на сервер, это не мешает Google его индексировать. Если он видит <a href="foobar#tag">baz</a>, он может связать baz с foobar и следовать только за частью foobar, но все еще нет причин, по которым он не может записать ассоциацию #tag ‹-› baz или представить эти данные в опубликованных ссылках и результаты поиска. Он может сделать предположение, что теги foobar и foobar # эквивалентны, то есть: не индексировать истинное содержимое тега foobar #, но это не мешает ему быть полезным - person Kent Fredric; 27.10.2010
comment
Весь этот ответ, за исключением одного абзаца, является избыточным. - person Lightness Races in Orbit; 03.01.2011
comment
@ TomalakGeret'kal Я так не думаю, я думаю, что для тех, кто хочет знать, как и почему (включая меня), это идеально продуманный ответ. Ваш комментарий также не добавляет ценности этому ответу. - person dsignr; 28.12.2011
comment
@imaginonic: Я опаздываю, но, как бы прекрасно он ни был, 90% этого не затрагивают #! аспект моего вопроса вообще. Вот почему он сказал, что это лишнее. Количество положительных голосов здесь, вероятно, связано с высоким трафиком, когда мой вопрос был доставлен в Hacker News, в сочетании с одной лишь длиной этого ответа. - person BoltClock; 21.02.2012
comment
Чтобы быть точным, сущность, на которую указывает # в URL-адресе, является атрибутом ID HTML-тега. Имя ID относится к тому факту, что идентификаторы уникальны, что означает (должен быть) только один тег с этим ID на всем веб-сайте, поэтому URL-адрес с хэш-кодом (#!some_page) так же уникален, как и URL-адрес без хеш-банга. - person trysis; 24.02.2014
comment
Вы в основном просто объясняете, для чего нужны теги привязки для URL. - person mr5; 29.05.2019

Прежде всего: я являюсь автором манифеста одностраничного интерфейса, цитируемого Раганвальдом.

Как очень хорошо объяснил Раганвальд, наиболее важным аспектом подхода одностраничного интерфейса (SPI), используемого в FaceBook и Twitter, является использование хэша # в URL-адресах.

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

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

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

Взгляните на это руководство, являющееся примером простого Сайт ItsNat SPI, но вы можете выбрать несколько идей для других фреймворков, этот пример SEO-совместим с любым поисковым роботом.

Сложная проблема состоит в том, чтобы сгенерировать любое (или выбранное) «состояние страницы AJAX» как обычный HTML для SEO, в ItsNat это очень просто и автоматически, тот же сайт находится в то же время SPI или страница, основанная для SEO (или когда JavaScript отключен для доступности). С другими веб-фреймворками вы можете когда-либо следовать подходу двойного сайта, один сайт основан на SPI, а другая страница - для SEO, например, Twitter использует эту технику «двойного сайта».

person jmarranz    schedule 17.10.2010
comment
А как насчет принципа прогрессивного улучшения? Сайт не должен вылетать из-за отключенного JavaScript. И поверьте мне, javascript отключен не только в устаревших браузерах, но и у многих осведомленных о безопасности пользователей, которым не нравится выполнение случайного JS. - person Roman Royter; 29.03.2011

Я был бы очень осторожным, если вы планируете принять это соглашение о хэшбэнге.

После хэшбэга вернуться назад уже нельзя. Это, вероятно, самая сложная проблема. В сообщении Бена подчеркивается, что, когда pushState получит более широкое распространение, мы сможем оставить хэшбэги позади и вернуться к традиционным URL-адресам. Что ж, факт в том, что ты не можешь. Ранее я заявлял, что URL-адреса вечны, они индексируются, архивируются и обычно хранятся. Вдобавок к этому классные URL не меняются. Мы не хотим отключаться от всех ценных ссылок на наш контент. Если вы в какой-то момент внедрили URL-адреса хэшбэга, то хотите изменить их, не разрывая ссылки, единственный способ сделать это - запустить JavaScript в корневом документе вашего домена. Навсегда. Это ни в коем случае не временно, вы застряли в этом.

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

person Jeff Atwood    schedule 24.02.2012
comment
Я думаю, что ваша критика хэшбэгов верна, но использование только pushState в качестве замены означает, что мы потеряем возможность загружать контент в одностраничное приложение на основе URL-адреса. Значит, нельзя делиться URL-адресами. - person Luke; 24.07.2014
comment
У меня была аналогичная проблема в моей работе - мы начали использовать Page.js (который использует pushState) для одностраничной навигации, где ранее мы использовали Hasher и Crossroads (хэширование). В результате нам потребовалось спасти пути типа /blah#foo/feep/baz?stuff=nonsense. Эквивалент нового пути будет /blah/foo/feep/baz?stuff=nonsense (примечание # заменено на /). Я сделал это просто с помощью маршрута в моей настройке, который перехватил /blah и проверил, есть ли у него, если да, добавив содержимое этого хэша после косой черты. Спасено. - person Gert Sønderby; 08.09.2015

Чтобы хорошо следить за всем этим, Twitter - один из пионеров хэшбэнг-URL и одностраничного интерфейса - признал, что система хэшбэга была медленной в долгосрочной перспективе и что они фактически начали менять решение и возвращаться к ссылки старой школы.

Статья об этом здесь.

person kingmaple    schedule 31.05.2012

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

Хеш, конечно, просто указывает на то, что реальной перезагрузки страницы не происходит, так что да, это для целей AJAX. Изменить: Раганвальд прекрасно объяснил это более подробно.

person Alan H.    schedule 16.10.2010

Ответы выше хорошо описывают, почему и как он используется в твиттере и фейсбуке, я пропустил объяснение того, что # делает по умолчанию ...

В «нормальном» (а не одностраничном приложении) вы можете сделать привязку с hash к любому элементу с идентификатором, поместив этот идентификатор элемента в url после хеша #

Пример:

(в Chrome) Нажмите F12 или Rihgt Mouse и Inspect element

введите здесь описание изображения

затем возьмите id="answer-10831233" и добавьте к URL-адресу, как показано ниже

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

и вы получите ссылку, которая перейдет к этому элементу на странице

Что такое shebang / hashbang ( #!) в Facebook и новые URL-адреса Twitter для?

Используя # способом, описанным в ответах выше, вы вводите конфликтующее поведение ... хотя я бы не потерял из-за этого сон ... поскольку Angular стал чем-то вроде стандарта ...

person Matas Vaitkevicius    schedule 12.07.2017
comment
Ответ raganwald содержит объяснение, которое вы пропустили. Тем не менее, я не понимаю, насколько полезен вопрос из учебника о том, как # работает - вопрос предполагает, что читатель уже знаком с фрагментами URL, и эта функциональность в любом случае здесь не актуальна, кроме вашего замечания о противоречивом поведении. - person BoltClock; 12.07.2017
comment
@BoltClock Привет, BoltClock, но без объяснения того, что является поведением по умолчанию, говоря, что «он будет конфликтовать», не дает читателю представления о том, что поставлено на карту, какие функции потенциально теряются ... Я просто люблю давать хорошие ответы с картинками, если Я вижу, что чего-то не хватает, настолько полного, насколько я могу их сделать ... - person Matas Vaitkevicius; 16.07.2017