Абсолютные и относительные ссылки. Относительный и абсолютный путь к файлу

11.01.07 44.5K

Как вы знаете, в параметре 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

В этой главе мы с вами поговорим ссылках-путях которые мы прописываем в атрибут HREF .
Все что на данный момент знаем так это только шаблон:
анкор
Для новичков этих знаний достаточно, для профи который берется за большой проект нет!!! Ведь в больших проектах существуют разделы, в которые нужно переходить и выходить... И тогда возникают вопросы как это сделать и как это сделать правильно?

Чтобы было проще учиться давайте создадим трех страничный сайт-визитку. Так как наш файл index.html не представляет для нас пока ни какой ценности мы его отредактируем и задействуем:

Создание сайтов Наше предложение
Наши контакты

Далее создадим файл delo.html , в котором расскажем о наших услугах: Наши услуги Главная страница
Наши контакты

А так-же создадим файл kontakt.html , для контактов с нами: <a href="/security/skript-formy-obratnoi-svyazi-forma-obratnoi-svyazi-s-pomoshchyu-jquery/">Обратная связь</a> Главная страница
Наше предложение

А теперь просмотрим (откроется в новой вкладке) что у нас получилось.

Этими примерами я хотел показать что все работает. Но, одно большое НО , мы обращаемся напрямую к файлам но а путей не видно...
Это и есть относительный путь , т.е. путь относительно ссылающегося файла, а самого пути не видно, потому что все наши файлы лежат в в одном каталоге(папке).
Давайте в нашей учебной папке(my_site) создадим еще одну папку с именем razdel и уже в ней создадим
новый файл с именем index.html . Как-же в этом случае поставить ссылку с наших файлов которые мы создали выше?
razdel/ index.html" >раздел
А если в папке razdel созтать папку podrazdel то путь уже будет с корневой папки:
razdel/podrazdel/ index.html" >подраздел
а с папки razdel
podrazdel/ index.html" >подраздел
Обратите внимание на то что разделителем между папками и/или файлами является "прямой сплеш"(косая черта).

Входить в папки мы научились, теперь посмотрим как выходить:
Чтобы выйти с папки podrazdel в razdel, нужно в путь добавить ../ , этот набор символов говорит браузеру что запрашиваемый файл лежит на один уровень выше:
../index.html " >Вернуться в раздел
Чтобы вернуться на 2 уровня эту комбинацию пишем дважды:
../../ index.html" >вернуться в корень сайта

Теперь предлагаю посмотреть на абсолютные пути. Абсолютный путь это путь файлов включающий в себя имя сайта и протокол(http или https). Представим что наша папка my_site и есть корень сайта, а имя сайта my_site.ru , в этом случае абсолютный путь будет:
http://my_site.ru или http://my_site.ru/ или http://my_site.ru/index.html
Тогда как абсолютный путь к папке razdel
http://my_site.ru/razdel или http://my_site.ru/razdel/ или http://my_site.ru/razdel/index.html

Какие пути лучше использовать? Абсолютные!!! Но есть вероятность наделать ошибок, т.к эти ссылки указывают на конкретный сайт и локально(без сервера) мы эти ошибки устранить не сможем...

И еще раз об главной странице, не ставте ссылку my_site.ru, потому что браузер все равно перенаправит на my_site.ru/ , т.е происходит редирект(перенаправленние), а поисковые системы не очень любят редирект.
Так-же ни когда не ставте ссылку my_site.ru/index.html, т.к. это дубль для my_site.ru/ и сточки зрения поисковых систем это две разных страницы, и в данном случае идет дублирование контента, а это не уважается поисковиками. Так что правильная ссылка для абсолютных это: my_site.ru/, а для относительных из одной папки: / или спуски: ../ . И еще если вы будете использовать абсолютные пути то вам нужно определиться как писать адрес(с www или без), здесь тоже все просто, если у вас персональный(выделенный) сервер то без, а если вы арендуете только часть сервера то с www .

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


В данном случае всё очень просто, мы указываем прямой путь к файлу, лежащему на другом домене. Возможно указание сокращенного пути через использование двух слешей в начале без явного указания 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 путями.

Любая web-страница, картинка, видео и т. д. это в первую очередь файл, имеющий свой абсолютный или относительный путь (адрес). Сам файл в сети Интернет находится на компьютере, который называется сервер . Таким образом, следует учесть способы представления файла на сервере и в сети Интернет. В данной статье мне бы хотелось прояснить перечисленные моменты и внести ясность в затронутый вопрос. Попробуем?

Абсолютный путь (адрес)

Что такое абсолютный путь к файлу?

Абсолютный путь или адрес - это полный путь или адрес, относительно домашней папки на сервере или доменного имени в сети Интернет .

Говоря «домашняя папка » я подразумеваю начало выделенного хостинг-провайдером пространства. Например, если речь идёт о локальном сервере, на операционной системе Windows, в качестве домашней папки будет выступать сам диск, т. е. C:/ . В тоже время, зачастую хостинг-провайдер выделяет пользователю лишь определенное виртуальное (условное) пространство, для которого в качестве домашней папки выступает определенная папка, зачастую называемая /home .

Говоря «доменное имя » я подразумеваю URL-адрес, который начинается с упоминания протокола, например: http://sitename.ru/ . В сети Интернет, именно он является домашней папкой для каждого из представленных ресурсов.

Как узнать абсолютный путь на сервере в PHP?

Если с URL-адресом всё более-менее понятно, то вот с домашней папкой на сервере дело обстоит несколько сложнее. В конце концов, у каждого провайдера есть свои заморочки и это следует учесть.

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

Уточню, говоря «корневая папка » я подразумеваю папку на сервере, выделенную для сайта. Именно она служит отправной точкой URL-адреса относительно доменного имени.

Для этого можно использовать константу __FILE__ , которая содержит полный путь и имя текущего файла, в котором она вызывается. Для того же чтобы получить только полный путь и убрать имя текущего файла, можно использовать функцию dirname() , которая возвращает родительский каталог указанного пути. Например:

$abspath = dirname(__FILE__) ."/";

В PHP 5.3 и новее, можно уже использовать константу __DIR__ :

$abspath = __DIR__

Таким образом очень удобно подключать в дальнейшем файл config.php и использовать полученный в нем абсолютный путь переменной $abspath как отправную точку. Например, предположим, что скрипт test.php находится в папке: path/ - а нужный файл data.txt в папке: data/ . В этом случае вызов может иметь вид:

Include_once("../config.php"); $fh = fopen($abspath ."/2013/12/data/data.txt", "r");

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

Относительный путь (адрес)

Что такое относительный путь к файлу?

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

Любая файловая система представляет собой строгую иерархию родительских и дочерних папок и файлов. Например: C:\folder\file.php – здесь папка folder\ является дочерней для диска C:\ и родительской для файла file.php .

Для наглядности давайте рассмотрим следующую иерархию:

  • file1.php
  • folder\
    • file.php
    • subfolder\
      • file3.php

Чтобы из файла C:\folder\file.php обратиться к файлу C:\file2.php , нам нужно выйти из текущей папки folder\ , т.е. подняться на один уровень выше. Для этого можно использовать, папку (я бы даже сказал псевдо-папку) родительского каталога , представляющую собой две точки (..) . Другими словами, мы получим путь: ..\file2.php - относительно файла file.php .

Чтобы из файла C:\folder\file.php обратиться с файлу C:\folder\subfolder\file3.php , нам нужно войти в подпапку subfolder\ , т.е. опуститься на один уровень ниже. Так мы получим путь: subfolder\file3.php - относительно файла file.php .

Давайте усложним задачу и обратимся из файла C:\folder\subfolder\file3.php к файлу C:\file2.php . Относительный путь будет иметь вид: ..\..\file2.php - мы поднялись на два уровня выше. Выполнить обратное, т.е из файла C:\file2.php обратимся к файлу C:\folder\subfolder\file3.php . Относительный путь будет иметь вид: folder\subfolder\file3.php - мы опустимся на два уровня ниже.

Преимущества и недостатки относительного пути (адреса)

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

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

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

Заключение

В своей статье я постарался рассмотреть фундаментальный вопрос, связанный с абсолютными и относительными путями (адресами) к файлам и папкам. По сути, если вы работаете на компьютере, то уже априори имеете представление о файловой системе, но без учета некоторых нюансов, достаточно сложно сдвинуться с мертвой точки и затронуть ряд вопрос, которые неизбежно относятся к правильности адресации. На этом у меня всё. Спасибо за внимание. Удачи!

в 8:00 Изменить сообщение 5 комментариев

Все HTML ссылки делятся на внешние и внутренние. Внешние ссылки - это ссылки, ведущие с одного сайта на другой сайт или файл, расположенный на другом сайте. Внутренние ссылки - это ссылки, ссылающиеся с одной страницы сайта на другую страницу этого же сайта или на разделы этой же страницы.

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

Все ссылки можно также условно разделить на относительные и абсолютные. Относительные ссылки - это HTML ссылки, содержащие относительные пути, относительные ссылки могут быть только внутренними. Абсолютные ссылки - это ссылки, содержащие абсолютные пути, абсолютные ссылки могут быть как внешними так и внутренними.

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

Относительный путь означает, что указание пути на нужный файл или страницу вашего сайта начинается относительно каталога, в котором расположена страница со ссылкой, либо относительно корневого каталога сайта. Рассмотрим части, из которых может состоять относительный путь:

Части пути Описание Примеры значений
имя_файла Если в качестве значения атрибута указать только имя файла это значит, что нужный файл находится в той же папке, где и страница со ссылкой. " page.html "
каталог/ Если файл, к которому нужно указать путь, расположен в дочернем каталоге относительно файла с ссылкой, это означает, что нам надо спуститься на один уровень вниз (в дочернюю папку текущего каталога), в этом случае путь начинается с указания имени дочернего каталога, после его имени указывается прямой слэш " / ", он служит для разделения частей пути, после него указывается имя нужного нам файла.

Примечание: опуститься можно ровно на столько папок вниз, сколько вы их создали. К примеру, если вы создали папку на 10 уровней ниже корневой, то можете указать путь, который приведет вас вниз на 10 папок. Однако, если у вас так много уровней, это, скорее всего, означает, что организация вашего сайта излишне неудобно составлена.

" каталог/page.html "

" каталог1/каталог2/page.html "

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

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

" ../page.html "

" ../../page.html "

" ../../../кат1/кат2/page.html " - поднимаемся из текущей папки на три каталога выше и уже из него спускаемся на два уровня ниже к требуемому файлу

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

Примечание: когда символ " / " указывается первым, это означает начало пути от корневого каталога.

" /page.html "

" /кат1/кат2/car.png "

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

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

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

Теперь давайте рассмотрим, что такое URL -адрес. Каждая веб-страница в сети Интернет имеет свой собственный уникальный адрес, вот он как раз и называется URL. Аббревиатура URL расшифровывается как U niform R esource L ocator (унифицированный адрес ресурса), проще говоря URL - это определитель местонахождения ресурса. Этот способ записи адреса стандартизирован в сети Интернет.



Понравилась статья? Поделиться с друзьями: