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.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
- Пользователь обращается к стартовой странице
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 может потребоваться больше усилий