Html полный или короткий путь к ресурсам. Относительные и абсолютные пути в HTML и PHP

Как вы знаете, в параметре href тега () необходимо указывать путь к файлу, на который делается ссылка.
Многие пишут что-то вроде http://somesite.ru/catalog/doc.html. Да, никто не спорит, это работает. Но есть одно "но". Рассмотрим на примере.

Пусть ваш сайт размещался, например, на каком-то бесплатном хостинге и его адрес был следующий: http://fsite.freehosting.ru.
На сервере лежит порядка 100 документов. И вот вы решили перенести свой сайт на другой домен,
пусть это будет платный хостинг в зоне ru: http://site.ru. Что же, везде теперь менять http://fsite.freehosting.ru на http://site.ru?
Да, благодаря таким редакторам как homesite, это возможно. Но это не выход.
Предположим, что прежде чем заливать страницу на сервер, вы проверяете ее работоспособность
на своем домашнем сервере apache (тем, кто еще не знает что такое "домашний сервер" — сюда(Установка и настройка сервера apache), и вместо http://localhost надо везде будет писать http://site.ru. Согласитесь это, по крайней мере, неудобно.

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

Абсолютный путь

Возьмем, к примеру, файл doc.html, который находится по адресу: http://somesite.ru/catalog/doc.html. На сервере, как известно, находится папка www. Как мы видим из адреса, в этой папке находится папка catalog, и уже в ней находится файл doc.html.

Если, при указывании пути к файлу, перед адресом поставить /, то это будет аналогично следующему: корневая_директория_на_севере/www/путь к файлу.
То есть, http://somesite.ru/catalog/doc.html аналогично следующему: /catalog/doc.html.
Итак, когда перед адресом стоит /, то это означает, что "отсчет" начинается с директории www.
Теперь вместо http://localhost/index.html из любого документа можно писать /index.html.
А вот что бы добраться до директории cgi надо писать так: /cgi-bin/путь к файлу.

Пути, созданные способами, описанными выше, называется абсолютными, т.к указывается абсолютный (полный) путь к файлу на сервере.

Относительный путь

Существуют также относительные пути, которые указываются относительно самого документа, откуда идет ссылка.
Например, если в doc.html создать ссылку newcat/new.html, то это подразумевает, что файл new.html находится в каталоге newcat, который, в свою очередь, находится в том же каталоге, что и файл doc.html. Как видите, этот путь указан относительно файла doc.html. Где бы этот файл не находился, путь newcat/new.html будет всегда справедлив, если файл doc.html и каталог newcat будут находиться на одном уровне (т.е. в одном каталоге).

Также относительно какого-то документа можно подняться на директорию вверх. Для этого необходимо написать../.
Например, есть каталог big, в нем находятся два каталога: primary и secondary. В каталоге primary лежит, уже знакомый нам файл doc.html; а в каталоге secondary находится файл new.html. Для того, чтобы из файла doc.html сделать ссылку на файл new.html, то нужно написать../secondary/new.html. А вот если каталог big находится в каталоге www, то путь к файлу new.html можно было указать и так: /big/secondary/new.html

Вместо заключения стоит сказать, что использование абсолютных и относительных путей значительно облегчает работу веб мастерам, будь то новичок или профессионал. Так что используйте эту возможность, как говорится, на полную катушку, и старайтесь избегать путей типа http://site.ru/catalog/file.file, или же, по крайней мере, прибегайте к их помощи как можно реже.

Хорошо Плохо

Абсолютные пути


В данном случае всё очень просто, мы указываем прямой путь к файлу, лежащему на другом домене. Возможно указание сокращенного пути через использование двух слешей в начале без явного указания http или https и сервер сам подставит нужный протокол (расширение) согласно настройке сервера. Важно заметить, что данный вид является необходимым для перехода между сайтами:
http://google.com

Относительно корня сайта


В данном случае браузер берёт домен сайта и к нему подставляет указанную ссылку. В данном случае получится http://сайт/css/style.css. В случае с http, https не надо париться, так как будет браться в том виде, в котором сейчас открыта страница, то есть при http будет http. Так же очень удобно для переноса некого функционала между разными сайтами или же перенос сайта с одного домена на другой не трогая код. Приоритетный способ указания путей к страницам и файлам.

Относительно данной страницы


Менее востребованный способ, так как он берёт нынешнюю страницу и к её пути дописывает новый адрес..com/trick/css/style.css . Практически невозможен в использовании в случаях, когда мы используем ЧПУ.

Использование тега base


В данном случае вместо стандартной подставки домена к относительному пути будет подставлен путь из base. То есть мы получим файл, располагающийся:
http://сайт/tricks/css/style.css

Относительные и абсолютные пути в PHP

Всё очень просто, работая в файловой системе мы будем придерживаться правил работы с путями в PHP. Если же мы передаём команду в браузер клиента, то тут используются пути HTML. То есть в следующем примере у нас из PHP передаётся путь браузеру с страницей, на которую ему надо перейти. То, что переход между страницами браузер осуществил можно увидеть в адресной строке:
header("Location: /page2.php");
Итого, открываем страницу page1.php, а в адресной строке записано page2.php, а всё дело в том, что браузер СНАЧАЛА загрузил страницу page1.php, а потом получил информацию с переадресацией и ЗАГРУЗИЛ страницу вторую page2.php. В данном случае переадресация была на стороне клиента (браузера), а значит используем правила относящиеся к HTML (веб-адрес).

Абсолютный путь в PHP

Абсолютный путь в PHP воспринимается как абсолютный путь от директории, в которой установлен веб-сервер. Данный путь можно получить из:
$_SERVER["DOCUMENT_ROOT"]
Если взять в пример этот сервер, то его путь: /home/school/public_html/schoolphp , значит для того, чтобы указать полный путь к фотографии "/photo/img1.jpg", необходимо указать такой путь:
getimagesize("/home/school/public_html/schoolphp/photo/img1.jpg"); getimagesize($_SERVER["DOCUMENT_ROOT"]."/photo/img1.jpg");
Хочу заметить, что сайт может располагаться в поддиректории, то есть для:
http://сайт/forum/
может быть крайне затруднительно использование DOCUMENT_ROOT, ведь форум (как внешний скрипт) ещё не знает где будет размещаться на сайте. Справиться с данной проблемой можно несколькими способами, давайте парочку перечислим:

1) Создать в виде поддомена страницу.

2) Прописать абсолютный путь в конфиге в config.php , то есть:
Core::$ROOT = $_SERVER["DOCUMENT_ROOT"]; getimagesize(Core::$ROOT."/photo/img1.jpg"); // используем абсолютный путь, который можно модифицировать
Теперь можно без угрызения совести привязать весь сайт на Core::$ROOT, и если случайным образом необходимо поменять путь до подключаемого файла, то можно переопределить значение Core::$ROOT;

Относительно стартового файла (базового)

Во многих системах index.php есть единая точка входа, то есть открывается index.php, а уже из него подключаются другие файлы.
include "./modules/allpages.php";
В данном случае будет подключен allpages.php по пути: /home/school/public_html/schoolphp/modules/allpages.php . Данный способ удобен тем, что если прописать include в файле allpages.php: include "./modules/module/page.php";, то искать его будет всё равно относительно точки входа, а именно index.php:
/home/school/public_html/schoolphp/modules/module/page.php
Достаточно удобная реализация учесть, что мы чётко знаем структуру нашего приложения относительно корневого index.php. Даже если мы вызываем любой другой файл, а не index.php, то работать пути будут абсолютно точно так же. Вызвали мы dir.php , значит относительно файла dir.php и будут браться пути!

Что ещё надо знать

Я не мог не напомнить тем, кто забыл или же подсказать тем, кто не знает, что можно вернуться не только вглубь директорий, но и вверх (на папки назад), и синтаксис их достаточно прост:
include "../file.php";
В данном случае будет браться директория данного файла или корневого index.php, и возвращаться на 1 папку назад, там же будет искаться файл "file.php".

DOCUMENT_ROOT не единственный вариант получить корневой путь сайта. Давайте взглянем в мануал: "Директория корня документов, в которой выполняется текущий скрипт, в точности та, которая указана в конфигурационном файле сервера." . Это значит, что в случаях, если в конфигурационном файле будет некорректно написан путь, то весь сайт не будет работать. Что делать? Можно писать админам и владельцам хостинга, на котором размещается сервер с надеждой, что они исправят свои недочёты. Или искать стабильную альтернативу, которой является __DIR__ , это абсолютный путь к данному файлу, где запущен код файлу. Допустим файл конфигурации у нас лежит в папке config, и чтобы используя __DIR__ не возвращаться каждый раз на 1 папку наверх записью __DIR__"/../" мы смело можем __DIR__ записать в свою переменную, примером ниже я записал в свойство класса (урок №24, кто не дошел используйте обычную переменную):
Core::$ROOT = __DIR__; // Или же для старых PHP - dirname(__FILE__);
Так же хотелось напомнить кое-что интересное и важное. Согласно безопасности веб-сервер запрещает перемещение по директориям выше корня сайта. То есть сайт находится по следующему пути: /home/school/public_html/schoolphp , но прочитать содержание папок /home, или /home/school будет недоступно.

Может ли PHP пользоваться путями HTML ? Да, в специальных функциях, для примера:
file_get_contets("http://сайт");

Практика

В своих старых проектах я использовал DOCUMENT_ROOT, сейчас перешел на относительные index.php пути "./папка/файл".

Zend2, продукт от разработчиков PHP, один из самых сложных FrameWork на данный момент использует так же относительные пути с отличным синтаксисом от моего, то есть "папка/файл".

Форум IPB.3 использует dirname(__FILE__).

Выводы:

1) В HTML используем пути относительно корня сайта, а именно "/file.php" (Строка начинается со слэша ).
2) в PHP используем относительно корневого файла "./file.php" (Строка начинается с точки и слэша ), альтернативой может быть использование свойства, инициализированного в корне: __DIR__;
3) Переадресация header использует пути из HTML. PHP работая с файловой системой (подключение файлов, сохранение и редактирование изображений) - с PHP путями.

Ссылки можно поделить на две категории:
ссылки на внешние ресурсы — создаются с помощью тега и используются для расширения возможностей текущего документа при обработке браузером;
гиперссылки — ссылки на другие ресурсы, которые пользователь может посетить или загрузить.

Как сделать гиперссылки на сайте

1. Структура ссылки

Гиперссылки создаются с помощью парного тега . Внутрь тега помещается текст, который будет отображаться на веб-странице. Текст ссылки отображается в браузере с подчёркиванием, цвет шрифта — синий, при наведении на ссылку курсор мыши меняет вид.

Обязательным параметром тега является атрибут href , который задает URl-адрес веб-страницы.

указатель ссылки

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

Адресная часть ссылки состоит из URl. URl (Uniform Resource Locator) — унифицированный адрес ресурса. При создании адресов для разделения слов между собой рекомендуется использовать дефис, а не символ подчёркивания. В общем виде URl имеющий следующий формат:

Метод доступа://имя сервера:порт/путь

Метод доступа , или протокол, осуществляет обмен данными между рабочими станциями в разных сетях. Наиболее распространенные протоколы передачи данных:

file обеспечивает чтение файла с локального диска:

File:/gallery/pictures/summer.html

http предоставляет доступ к веб-странице по протоколу HTTP:

Http://site.ru/

https - специальная реализация протокола HTTP, использующая шифрование (как правило, SSL или TLS)

Https://site.ru/

ftp осуществляет запрос к FTP-серверу на получение файла:

Ftp://pgu/directory/library

mailto запускает сеанс почтовой связи с указанным адресатом и хостом:

Mailto: [email protected]

Имя сервера описывает полное имя машины в сети, например, site.ru . Если имя сервера не указано, то ссылка считается локальной, т.е. она относится к той же машине, на которой находится HTML-документ, содержащий ссылку.

Номер порта ТСР , на котором функционирует веб-сервер. Представляет собой число, которое необходимо указывать, если метод требует номер порта (отдельные сервера могут иметь свой отличительный номер порта). Если порт не указан, по умолчанию используется порт 80. Стандартными портами являются:
21 — FTP
23 — Telnet
70 — Gopher
80 — HTTP

Путь содержит имя папки, в которой находится файл.

2. Абсолютный и относительный путь

Когда в ссылке указывается только имя файла, браузер предполагает, что файл находится в той же папке, что и документ, содержащий гиперссылку. На практике веб-сайты содержат сотни документов, которые размещают в отдельные папки, чтобы ими было легче управлять. Чтобы создать ссылку на файл, находящийся вне папки, содержащей текущий документ, необходимо указать расположение файла или путь. HTML поддерживает два вида пути: абсолютный и относительный.

Рис. 1. Пример структуры папок

2.1. Абсолютный путь

Абсолютный путь указывает точное местоположение файла в пределах всей структуры папок на компьютере (сервере). Абсолютный путь к файлу даёт доступ к файлу со сторонних ресурсов и содержит следующие компоненты:
1) протокол, например, http (опционально);
2) домен (доменное имя или IP-адрес компьютера);
3) папка (имя папки, указывающей путь к файлу);
4) файл (имя файла).

Существует два вида записи абсолютного пути — с указанием протокола и без него:

Http://site.ru/pages/tips/tips1.html //site.ru/pages/tips/tips1.html

Если файл находится в корневой папке, то путь к файлу будет следующим:

Http://site.ru/index.html

При отсутствии имени файла будет загружаться веб-страница, которая задана по умолчанию в настройках веб-сервера (так называемый индексный файл).

Http://site.ru/

Обычно в качестве индексного файла выступает документ с именем index.html . Наличие завершающего слеша / означает, что обращение идет к папке, если его нет — напрямую к файлу.

2.2. Относительный путь

Относительный путь описывает путь к указанному документу относительно текущего. Путь определяется с учётом местоположения веб-страницы, на которой находится ссылка. Относительные ссылки используются при создании ссылок на другие документы на одном и том же сайте. Когда браузер не находит в ссылке протокол http:// , он выполняет поиск указанного документа на том же сервере.

Относительный путь содержит следующие компоненты:
1) папка (имя папки, указывающей путь к файлу);
2) файл (имя файла).

Путь для относительных ссылок имеет три специальных обозначения:
/ указывает на корневую директорию и говорит о том, что нужно начать путь от корневого каталога документов и идти вниз до следующей папки
./ указывает на текущую папку
../ подняться на одну папку (директорию) выше

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

3. Якоря

Якоря , или внутренние ссылки, создают переходы на различные разделы текущей веб-страницы, позволяя быстро перемещаться между разделами. Это оказывается очень удобным в случае, когда на странице слишком много текста. Внутренние ссылки также создаются при помощи тега с разницей в том, что атрибут href содержит имя указателя — так называемый якорь , а не URl-адрес. Перед именем указателя всегда ставится знак # .

При разработке сайта часто приходится прописывать пути к файлам, ссылки на документы, страницы.
В книгах по компьютерным технологиям можно часто встретить употребление терминов абсолютного и относительного пути к файлам. Часто автор не разъясняет, что означает тот или иной путь. Читатель, соответственно, путается, когда автор в последствии говорит об использовании абсолютного и(или) относительного пути.
Допустим, у Вас есть сайт и Вам нужно создать гиперссылку(ссылку) на одну из страниц сайта. Здесь нужно выбрать какой использовать тип пути: относительный или абсолютный.

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

Так как большую часть своего времени я уделяю web-технологиям, то примеры буду приводить относящиеся к созданию сайтов.

Абсолютный путь

Когда ссылка представляет из себя полный URL файла или страницы, это и есть абсолютный путь . При этом в адресе должен присутствовать используемый протокол. Например, http://www.сайт — это абсолютный путь к конкретному веб-сайту. В данном случае абсолютный путь к главной странице моего блога. Где протоколом является http , а www.сайт доменом(именем).

Если указывать ссылку на католог, например http://yourdomain.ua/web/ то будет загружаться(отображаться) индексный файл. Это правило применимо в основном к статическим сайтам. Так как при использовании языка программирования можно создать внутренний роутинг. Индексный файл обычно представляет из себя файл с именем index.php, index.html, index.phtml, index.shtml . Для того что бы использовать другой индексный файл, нужно создать в нужной директории файл с именем.htaccess, и в нем прописать некоторую директиву. Изменение и создание файла.htaccess, как и роутинг с помощью языка программирования, выходит за рамки этой статьи.

В основном абсолютный путь используется, тогда, когда нужно сослаться на другой сайт. Иными словами если Вы хотите отправить посетителя на другой сайт, то нужно использовать абсолютный путь. Хотя, такой путь можно использовать и на собственном сайте. Но многие придерживаются того, что ссылки внутри сайта должны быть относительными.
Использование абсолютного пути может повлечь за собой некоторые проблемы. Например при переносе сайта с локальной машины на сервер(это в том случае, если вы использовали на локальной машине адреса в виде http://localhost/sitename.ua/…). Трудности могут возникнуть, тогда, когда появится необходимость в смене домена(имени сайта). Хотя, все эти трудности решаемы, но на них придётся потратить некоторое количество времени.
Когда есть минусы, значит должны быть и плюсы. Возьмём к примеру такую ситуацию, как кража контента с вашего сайта. На практике я уже не раз убедился в том, что текст воруют целиком, при этом не оставляя обратной ссылки на оригинал. Так вот, при использовании абсолютных путей, можно получить обратные ссылки с сайта, на котором находится сворованный контент. Но это только в том случае если у Вас внутренняя перелинковка осуществлялась с использованием абсолютных путей. Хотя это не всегда работает, но я уже не раз замечал появление ссылок с чужих сайтов, на которых был расположен мой контент.

Немного отступив от темы хочу вкратце рассказать про то что такое URL .

Каждая веб-страница или документ в сети Интернет имеет собственный уникальный адрес, который и называется URL .
URL — единообразный локатор (определитель местонахождения) ресурса. Расшифровывается URL как Uniform Resource Locator(унифицированный адрес ресурса). Можно так же встретить и такую расшифровку как Universal Resource Locator(универсальный локатор ресурса). Этот способ записи адреса стандартизирован в сети Интернет. Более общая и широкая система идентификации ресурсов URI постепенно заменяет термин URL.
URI - это символьная строка, которая идентифицирует какой-либо ресурс: документ, файл, и т.д. Конечно, здесь подразумеваются ресурсы сети Интернет.

Относительный путь

Часто относительные пути используются гораздо чаще чем абсолютные пути. В основном относительный путь указывается тогда, когда Вам нужно отправить посетителя на другую страницу Вашего сайта, или вставить объект (например изображение) на одной из страниц. При этом использование относительно пути вполне оправдано. В зависимости от структуры сайта, зависит то, какую форму относительного пути нужно использовать. Существует два вида относительного пути: путь относительно документа, путь относительно корня сайта.

Путь относительно документа

Именно путь относительно документа используется чаще всего. Такие ссылки ещё называются локальными. В основном такой путь используется тогда, когда текущий и связанный документ(страница) находятся в одной директории. Если переместить документ в другую директорию, то путь(ссылку) придётся менять. Хотя можно ссылаться и на документы(страницы) из других директорий. Для этого путь прописывается от текущего документа до целевого документа(страницы). При этом путь относительно документа должен задаваться в зависимости от структуры директорий.
Возьмём к примеру простейшую структуру статического сайта.

Предположим, что каждое изображение в каталоге images нужно вставить в соответствующие страницы home.html , products.html , contact.htm l. Для того что бы вставить изображение к примеру на страницу «home.html», нужно прописать путь, где расположено изображение. Если использовать путь относительно документа, то нужно будет прописать в коде страницы следующее:

Этот код для вставки изображения на страницу — неполный. Так как он не содержит нескольких важных атрибутов, таких как ширина, высота и др. Атрибут src , здесь служит для указания пути к файлу. Здесь опущены все остальные атрибуты, так как они сейчас не столь важны. Главное сейчас, что бы Вы имели представление о том, как выглядит путь относительно документа.
При использовании путей относительно документа отсутствует часть абсолютного пути. Часть абсолютного пути, здесь усекается, как для текущего документа(страницы), так и для связанного. Здесь используется только та часть пути, которая всегда меняется.
Напомню ещё раз про то, что при использовании пути относительно документа, нужно учитывать исходное расположение файлов.

Представим ситуацию, когда страница products.html , будет располагаться не в корневой директории сайта(как это было в предыдущем примере), а в подкаталоге. Теперь необходимо вставить изображение, в файл products.html , который находится, глубже чем корневая директория сайта.

Для того, что бы вставить изображение в файл products.html нужно вернуться в корневую директорию. После чего, можно использовать уже известный путь, о котором говорилось чуть выше.

Как видно из приведённого выше кода, к пути теперь добавилось следующее: ../ . Как раз эта последовательность символов ../ и служит для перехода на одну директорию(уровень) выше в иерархии каталогов. Путь в вышеприведённом коде можно прочесть так: «Перейти на один каталог выше(назад), зайти в директорию images и взять от туда файл products.png «.
Если ../ означает переход на одну директорию(уровень) выше в иерархии каталогов, то символ / обозначает переход на один уровень ниже.
Последовательность символов ../ можно использовать в пути неоднократно. Например, если файл products.html переместить в три директории вложенные в друг друга, то нужно будет использовать следующий код:

Как видно из предыдущих примеров, использование путей относительно документа во многих случаях оправдано. Такой вид пути часто применяется в практике, и его можно применить практически в любой ситуации. Как я уже говорил выше, существует ещё путь относительно корня сайта, о котором собственно и пойдет речь ниже.

Путь относительно корня сайта

Вы наверное уже поняли что пути относительно документа используются очень часто. Но при их использовании существует одна проблема. Которая заключается в том, что при смене структуры директорий, пути придется менять.
Но такая проблема решаема при использовании путей относительно корня сайта . Где путь указывается от корневой директории до документа.
Все пути относительно корня сайта начинаются со знака / . Только здесь, в отличии от путей относительно документа этот знак используется для указания корневой директории. Потому, что он используется в начале пути.
Путь относительно корня сайта позволяет перемещать некоторые файлы, без ущерба для ссылок. Этот тип пути Вы сможете использовать только на web-сервере в интернете, или на web-сервере расположенном на локальной машине.

В качестве web-сервера на локальной машине может выступать — . Который позволит у себя на компьютере создать среду для созданию сайтов и их предварительного тестирования.

Корневой относительный путь не содержит ни протокола http, ни доменного имени. И как я уже говорил начинается с указания символа / , который указывает на корневую директорию. В этой директории обычно располагается индексный файл главной страницы.

Например, /images/products.png обозначает, что файл products.png находится в папке images , которая расположена в корневом каталоге.

Самый простой способ определить корневой относительный путь — взять абсолютный и отбросить http:// и имя хоста.

Пример
Иногда бывает нужно, что бы информацию одной страницы использовали другие страницы сайта. Часто это делается для того что бы сократить количество повторяемого кода на каждой странице. Допустим есть файл _contact.html , который содержит информацию о телефонных номерах, e-mail и содержит изображение contact.png . (Пускай это будет небольшая таблица, которая будет располагаться на каждой странице сайта.)

Следующий код предназначен для вставки изображения «contact.png».

Код, который необходим для вставки одного файла в другой, выходит за рамки этой статьи. Здесь все зависит от используемого языка программирования.

Я надеюсь, что Вы уже знаете какой тип пути использовался в вышеприведённом коде. Если нет, тогда посмотрите приведённое выше определение пути относительно документа.
Теперь, когда посетитель зайдет на такие страницы сайта как home.html , contact.ntml , он увидит прекрасно отображаемую страницу. В каждую из которых вставлен файл _contact.html , в который, в свою очередь, вставлено изображение contact.png .
Другими словами зайдя, к примеру, на страницу home.html , происходит следующее: «Выполняется код основной страницы home.html . Затем вставляется и исполняется код страницы _contact.html . Код страницы _contact.html , говорит что нужно перейти в директорию images и взять от туда изображение contact.png «.
Если опустить сам код для вставки, то все работает отлично. Но вот если запустить страницу products.html , то произойдет ошибка. Так как код будет пытаться найти директорию images и файл contact.png в директории products . Но такой директории там не существует, из за чего собственно и возникает проблема.
Становится ясным, что использовать путь относительно документа здесь нельзя.
Конечно здесь можно использовать абсолютный путь. О плюсах и минусах данного подхода я говорил выше.
В общем говоря, это одна из ситуаций, когда нужно использовать путь относительно корня сайта. При использовании пути относительно корня сайта, ссылка будет всегда начинаться с корневого каталога(корня сайта). Такой тип пути позволит использовать код для вставки, например изображения, независимо от иерархии сайта, и его директорий.
Использование пути относительно корня сайта в вышеприведённом примере, позволит избежать проблем, со вставкой изображения. Потому как независимо от того где будет использовать такой тип пути, он всегда найдет указанный в нем файл.
Путь относительно корня сайта, очень похож на путь относительно документа. Для того что бы создать путь относительно корня сайта, нужно добавить символ / в начало пути.

Теперь изображение будет корректно вставляться на любой из страниц сайта.

Надеюсь я немного помог Вам разобраться в том какие пути существуют, и в том когда и где они используются. Теперь можно использовать все типы пути по прямому их назначению.

Как вы знаете, в параметре href тега () необходимо указывать путь к файлу, на который делается ссылка.
Многие пишут что-то вроде http://somesite.ru/catalog/doc.html. Да, никто не спорит, это работает. Но есть одно "но". Рассмотрим на примере.

Пусть ваш сайт размещался, например, на каком-то бесплатном хостинге и его адрес был следующий: http://fsite.freehosting.ru.
На сервере лежит порядка 100 документов. И вот вы решили перенести свой сайт на другой домен,
пусть это будет платный хостинг в зоне ru: http://site.ru. Что же, везде теперь менять http://fsite.freehosting.ru на http://site.ru?
Да, благодаря таким редакторам как homesite, это возможно. Но это не выход.
Предположим, что прежде чем заливать страницу на сервер, вы проверяете ее работоспособность
на своем домашнем сервере apache (тем, кто еще не знает что такое "домашний сервер" - сюда(Установка и настройка сервера apache), и вместо http://localhost надо везде будет писать http://site.ru. Согласитесь это, по крайней мере, неудобно.

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

Абсолютный путь

Возьмем, к примеру, файл doc.html, который находится по адресу: http://somesite.ru/catalog/doc.html. На сервере, как известно, находится папка www. Как мы видим из адреса, в этой папке находится папка catalog, и уже в ней находится файл doc.html.

Если, при указывании пути к файлу, перед адресом поставить /, то это будет аналогично следующему: корневая_директория_на_севере/www/путь к файлу.
То есть, http://somesite.ru/catalog/doc.html аналогично следующему: /catalog/doc.html.
Итак, когда перед адресом стоит /, то это означает, что "отсчет" начинается с директории www.
Теперь вместо http://localhost/index.html из любого документа можно писать /index.html.
А вот что бы добраться до директории cgi надо писать так: /cgi-bin/путь к файлу.

Пути, созданные способами, описанными выше, называется абсолютными, т.к указывается абсолютный (полный) путь к файлу на сервере.

Относительный путь

Существуют также относительные пути, которые указываются относительно самого документа, откуда идет ссылка.
Например, если в doc.html создать ссылку newcat/new.html, то это подразумевает, что файл new.html находится в каталоге newcat, который, в свою очередь, находится в том же каталоге, что и файл doc.html. Как видите, этот путь указан относительно файла doc.html. Где бы этот файл не находился, путь newcat/new.html будет всегда справедлив, если файл doc.html и каталог newcat будут находиться на одном уровне (т.е. в одном каталоге).

Также относительно какого-то документа можно подняться на директорию вверх. Для этого необходимо написать../.
Например, есть каталог big, в нем находятся два каталога: primary и secondary. В каталоге primary лежит, уже знакомый нам файл doc.html; а в каталоге secondary находится файл new.html. Для того, чтобы из файла doc.html сделать ссылку на файл new.html, то нужно написать../secondary/new.html. А вот если каталог big находится в каталоге www, то путь к файлу new.html можно было указать и так: /big/secondary/new.html

Вместо заключения стоит сказать, что использование абсолютных и относительных путей значительно облегчает работу веб мастерам, будь то новичок или профессионал. Так что используйте эту возможность, как говорится, на полную катушку, и старайтесь избегать путей типа http://site.ru/catalog/file.file, или же, по крайней мере, прибегайте к их помощи как можно реже.