URI-пути #

Васильев Андрей Михайлович, 2024

Версии презентации

Раздача неизменяемых данных #

Задачей первых HTTP-серверов стояла раздача файлов с файловой системы

Таким образом для идентификации документов в качестве основы были взяты пути к файлам на жёстком диске в рамках доминирующего ОС семейства UNIX

  • Все данные хранятся в едином дереве каталогов
  • Разделителем пути является /

Пример пути к файлу: /var/www/site/index.html

Внешнему наблюдателю не надо показывать все файлы на файловой системе, а только файлы в определённом каталоге, например в каталоге /var/www/site

Т.е. запрос документа по пути /index.html должен приводить к отдаче документа с файловой системы /var/www/site/index.html

Идентификация документов #

Для указания местоположения целевого документа в сети Интернет используется Uniform Resource Identifier, URI

  • Представляет собой символьную строку, которая идентифицирует ресурс
  • Может быть применена как в сети Интернет, так и в других средах

Что такое URL-адрес

Структура URI #

[ схема ":" ] [ // источник ] путь [ "?" запрос ] [ "#" фрагмент ]

Блоки внутри [ ] являются опциональными и могут быть опущены

  • Схема обычно описывает протокол доступа: http, ftp, file и т.д.
  • Источник содержит адрес сервера, на котором расположен документ
  • Путь описывает местоположение документа на источнике
  • Запрос описывает дополнительные параметры к получаемому документу
  • Фрагмент содержит указание на часть документа

Идентификация в рамках протокола HTTP #

Рассмотрим веб-сервер web-app.net, раздающий документы из файловой системы

Структура ФС:

/var/www/site
├── 404.html
├── assets
│   └── main.css.map
├── feed.xml
├── index.html
├── labs
│   ├── 001-lab-01.html
│   └── 002-lab-02.html
├── labs.html
├── reference
│   ├── books.html
│   ├── editors.html
│   ├── schedule.html
│   └── tasks.html
└── topics.html
  • Схема доступа к данным — http
  • Иерархическая часть строится из имени сервера и расположения документа на сервере
  • Корневым каталогом для сервера является /var/www/site

Для файла /var/www/site/index.html URI будет

http://web-app.net/index.html

Для файла /var/www/site/reference/tasks.html

http://web-app.net/reference/tasks.html

В рамках протокола HTTP иерархия соответствует файловой системе с разделителем /

Идентификация файлов на файловой системе #

Для указания пути к локальным файлам существует собственная схема — file

file://host/path
  • Префикс схемы file://
  • Затем идёт указание имени компьютера, на котором расположен файл
  • Если имя компьютера не указано, то считается текущий компьютер localhost
  • Иерархическая часть описывает местоположение файла в рамках файловой системы
  • В качестве разделителя используется прямой слеш /
  • Для файла в ОС семейства Windows
    • Путь: C:\my-site\information.html
    • URI с хостом: file://localhost/C:/my-site/information.html
    • URI: file:///C:/my-site/information.html
  • Для файла в Unix-подобных ОС
    • Путь: /var/www/my-site/index.html
    • URI с хостом: file://localhost/var/ww/my-site/index.html
    • URI: file:///var/www/my-site/index.html

Полные и частичные URI #

Ключевая особенность гипертекста — формировать ссылки между документами в сети, связывая их в единую сеть

  • Ссылка может вести на документ на другом сервере (обязательно полный URI)
  • Ссылка может вести на документ на текущем сервере

В рамках последней схемы удобно использовать частичные URI

Частичный URI #

  • При формировании частичного URI не надо указывать ни схему, ни название сервера, на котором находится документ, только путь
  • Частичные URI могут быть использованы только внутри документа для описания пути к другим документам, пользователям браузер показывает обычно полные URI
  • Клиент (браузер) при обращении по частичной ссылке преобразует её в абсолютную
URI документа = абсолютный URI текущего документа + частичный URI

Частичные URI могут быть относительными или абсолютными

Относительные и абсолютные частичные URI #

  • Абсолютный частичный путь — путь из корня сайта
  • Относительный частичный путь — путь относительно текущего документа

Отличить абсолютный путь от относительного легко — он начинается с символа /

/
├── css
│   └── style.css
├── index.html
└── topic
    ├── list.html
    ├── topic-1.html
    └── topic-2.html
  • Абсолютный частичный путь к документу index.html:
    /index.html
  • Абсолютный частичный путь к документу style.css:
    /css/style.css

Они будут одинаковыми для любого просматриваемого документа на сайте

При формировании относительных частичных путей используется каталог, в котором находится документ с ссылкой

  • Для файла /index.html таким каталогом каталогом является /
  • Для файла /topic/topic-2.html/topic

Абсолютные частичные URI на документы #

При формировании ссылки к документу внутри одного сайта удобно использовать абсолютный путь для общих документов: файлы стилей, исполняемые JS/WS-модули

Рассмотрим структуру сайта example-app.net

/
├── css
│   └── style.css
├── index.html
└── topic
    ├── list.html
    ├── topic-1.html
    └── topic-2.html

В рамках сайта у каждого файла будет свой собственный абсолютные частичные URL:

  • style.css: /style.css
  • index.html: /index.html
  • list.html: /topic/list.html
  • topic-1.html: /topic/topic-1.html
  • topic-2.html: /topic/topic-2.html

С точки зрения оптимизации поисковых алгоритмов однажды опубликованный документ в сети Интернет не должен изменять своего пути

Пример построения относительных путей #

Построим относительный путь от файла /index.html

/
├── css
│   └── style.css
├── index.html
└── topic
    ├── list.html
    ├── topic-1.html
    └── topic-2.html
  1. Пользователь обращается к стартовой странице http://example-app.net/index.html
  2. Для оформления содержимого в документе указана ссылка на CSS-стили: css/style.css
  3. Клиентское приложение формирует абсолютный путь
    1. Высчитывается расположение документа, /
    2. К пути добавляется относительный путь
      css/style.css: /css/style.css
    3. Формируется URL, в котором добавляется схема, и имя сервера http://example-app.net:
      http://example-app.net/css/style.css

Относительный путь к родительскому каталогу #

Рассмотрим построение пути от файла topic-1.html к файлу /css/style.css

/
├── css
│   └── style.css
├── index.html
└── topic
    ├── list.html
    ├── topic-1.html
    └── topic-2.html

Для обращения к родительскому каталогу следует использовать специальное название каталога — ..

Этот специальный каталог присутствует и в обычной файловой системе и может быть использован не только в

  1. Пользователь обращается к стартовой странице http://example-app.net/topic/topic-1.html
  2. Для оформления содержимого в документе указана ссылка на CSS-стили: ../css/style.css
  3. Клиентское приложение формирует абсолютный путь
    1. Высчитывается расположение документа на сервере, /topic/
    2. К пути добавляется относительный путь ../css/style.css:
      1. /topic/../css/style.css
      2. /css/style.css
    3. Формируется URL, в котором добавляется схема, и имя сервера
      http://example-app.net: http://example-app.net/css/style.css

Какие URI использовать? #

Выделили следующие типы URI:

  • Полный URI, включающий схему и имя хоста и путь к файлу
  • Абсолютный частичный URI, включающий путь к файлу от корня
  • Относительный частичный URI, включающий путь от расположения файла

При ссылке на документ на другом сайте #

Возможно использовать только полный URI

Ссылка на документ собственного сайта #

Удобно использовать частичный URI, так как:

  • Он значительно короче полного пути, его легче использовать
  • Адрес сайта может измениться за время его существования

Абсолютный или относительный частичный URI? #

К плюсам использования относительного частичного URI относят:

  • Возможность работы с документами как через веб-сервер (схема http), так и через уровень файловой системы (схема file)
  • Возможность размещения документов сайта не только в корне сервера
  • Возможность предоставления одинаковых документов в разных частях нескольких сайтов (может быть и недостатком)
  • Возможность предоставления документов другим пользователям

Ограничения относительных частичных URI:

  • Некоторые документы требуют указания абсолютных частичных URI
  • Для формирования относительных URI может потребоваться больше усилий