Кратко

  • Часть адреса после # отделяется от адреса получения ресурса и разбирается на стороне читателя с учётом полученного представления.
  • Именованные якоря HTML были первым знакомым применением; позднее фрагменты научились указывать диапазоны строк и символов простого текста.

Ссылка на начало длинного документа — это вежливое предложение поискать нужное место самостоятельно. Ссылка с # похожа на раскрытую книгу с пальцем на нужном абзаце. Сервер передаёт документ; автор ссылки указывает место; браузер доставляет туда взгляд. Для этого абзацу не требуется собственный адрес на сервере.

Такое разделение видно уже в RFC 1808, опубликованном в июне 1995 года. При разборе относительного URL алгоритм сначала отделяет # и следующий за ним фрагмент. В том же году HTML 2.0 в RFC 1866 описал наглядный случай: #fragment ведёт к якорю в документе, например к элементу A с соответствующим атрибутом NAME. По сети приходит вся страница, но читатель может оказаться сразу у нужного фрагмента.

В архитектурной заметке W3C от апреля 1997 года Tim Berners-Lee объяснил передачу эстафеты. Сервер возвращает представление ресурса; клиент отдаёт фрагмент программе, понимающей его тип данных. HTTP-сервер этого суффикса не получает. Даже само слово «фрагмент», заметил автор, способно ввести в заблуждение: суффикс может обозначать часть, способ просмотра или иной объект, определённый форматом. Закладка в книге — лишь самая удобная метафора.

RFC 3986, вышедший в 2005 году, описал более общий механизм косвенной ссылки. Фрагмент обозначает вторичный ресурс через основной, а его смысл зависит от типа полученного представления. Здесь у технической нормы появляется редакционное следствие. Цитирующий может выбрать точку внутри уже опубликованного материала, не дожидаясь, пока издатель создаст отдельный серверный путь для каждого абзаца. Издатель задаёт содержание; автор ссылки задаёт точку входа.

Дальше дело вышло за пределы HTML. RFC 5147 2008 года задал фрагменты для text/plain: позиции и диапазоны символов и строк. В обычном текстовом файле нет идентификаторов HTML-элементов, зато есть строки и символы. Один и тот же знак позволяет выбрать подходящую карту для разных видов документов.

Граница осталась и в современной семантике HTTP, RFC 9110: фрагмент не входит в целевой URI, отправляемый в запросе. Сервер получает запрос на основной ресурс, браузер разбирает адресную подсказку после получения представления. Если якорь переименован или строки переместились, старая закладка может промахнуться. Устойчивые внутренние имена потому и ценны, что ссылки живут дольше очередной перестановки текста.

У символа # скромная должность на клавиатуре и дерзкая роль в чтении. Хозяин страницы устраивает парадный вход. Тот, кто пишет ссылку, вправе пригласить читателя прямо к картине в дальнем зале.