URI-пути #
Васильев Андрей Михайлович, 2024
Версии презентации
Раздача неизменяемых данных #
Задачей первых HTTP-серверов стояла раздача файлов с файловой системы
Таким образом для идентификации документов в качестве основы были взяты пути к файлам на жёстком диске в рамках доминирующего ОС семейства UNIX
- Все данные хранятся в едином дереве каталогов
 - Разделителем пути является 
/ 
Пример пути к файлу: /var/www/site/index.html
Внешнему наблюдателю не надо показывать все файлы на файловой системе, а только
файлы в определённом каталоге, например в каталоге /var/www/site
Т.е. запрос документа по пути /index.html должен приводить к отдаче документа
с файловой системы /var/www/site/index.html
Идентификация документов #
Для указания местоположения целевого документа в сети Интернет используется Uniform Resource Identifier, URI
- Представляет собой символьную строку, которая идентифицирует ресурс
 - Может быть применена как в сети Интернет, так и в других средах
 
Структура 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.cssindex.html:/index.htmllist.html:/topic/list.htmltopic-1.html:/topic/topic-1.htmltopic-2.html:/topic/topic-2.html
С точки зрения оптимизации поисковых алгоритмов однажды опубликованный документ в сети Интернет не должен изменять своего пути
Пример построения относительных путей #
Построим относительный путь от файла /index.html
/
├── css
│   └── style.css
├── index.html
└── topic
    ├── list.html
    ├── topic-1.html
    └── topic-2.html- Пользователь обращается к стартовой странице 
http://example-app.net/index.html - Для оформления содержимого в документе указана ссылка на CSS-стили: 
css/style.css - Клиентское приложение формирует абсолютный путь
- Высчитывается расположение документа, 
/ - К пути добавляется относительный путь
css/style.css: /css/style.css - Формируется 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Для обращения к родительскому каталогу следует использовать специальное название каталога — ..
Этот специальный каталог присутствует и в обычной файловой системе и может быть использован не только в
- Пользователь обращается к стартовой странице 
http://example-app.net/topic/topic-1.html - Для оформления содержимого в документе указана ссылка на CSS-стили: 
../css/style.css - Клиентское приложение формирует абсолютный путь
- Высчитывается расположение документа на сервере, 
/topic/ - К пути добавляется относительный путь 
../css/style.css:/topic/../css/style.css/css/style.css
 - Формируется 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 может потребоваться больше усилий