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


В статье приведены кусочки кода. Полную версию можно взять тут — https://bitbucket.org/okiseleva/html-and-css-learn/src . Папки — «absolute_path_lvl_1» и все вложенные.

Путь может быть абсолютный и относительный.

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

Абсолютный путь — это путь от корневой папки к файлу.

Путь состоит из всех папок, которые нам надо просмотреть, разделенных через слеш. Посмотрим на примере:

/absolute_path_lvl_1/level_2.1/level_3.1/Kevin.png

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

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

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

Если опускаем вниз по папкам, разделяем также через «/». Если надо подняться на уровень выше, пишем «..»

1. Самый простой пример относительного пути - это просто имя файла. если файл лежит рядом, просто указываем его имя

Hello.png

Относительный путь, файл рядом


2. Поднимаемся на папку выше

../Kevin_lvl_2.png

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

3. Пример посложнее, из Diff_paths.html к картинке с Кевином

../level_2.1/level_3.1/Kevin.png

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


Чем отличаются абсолютный и относительный пути

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

Если в начале пути корень не указать, то этот путь будет относительным, и он достраивается от текущего положения. В реальной жизни это напоминает дорогу к винному магазину - "два квартала налево и там все время прямо". Дойти по такому пути можно только из конкретной точки. Из другой ты попадешь уже в совсем другое место.

В файле absolute_path_lvl_1 / level_2.2 / Diff_paths.html можно посмотреть пример HTML страницы с разными путями к файлам.

Вот пример абсолютного и относительного пути для одного и того же файла с Кевином.


D:/hgprojects → сюда у меня выкачан проект «html-and-css-learn». У вас может быть другой путь


PS — подробнее в книге «

Как вы знаете, в параметре 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://) и содержать имя сайта. Относительные ссылки ведут отсчет от корня сайта или текущего документа.

В примере 8.2 показано создание абсолютной ссылки на другой сайт.

Пример 8.2. Использование абсолютных ссылок

Абсолютный адрес

Изучение HTML

При указании в качестве ссылки каталога сайта (например, http://сайт/css/), отображается индексный файл . Это файл, который загружается по умолчанию при обращении к каталогу без явного указания имени файла. Обычно в качестве индексного файла выступает документ с именем index.html .

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

Ссылки относительно текущего документа

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

1. Файлы располагаются в одной папке (рис. 8.4).

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

2. Файлы размещаются в разных папках (рис. 8.5).

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

Две точки в данном случае означают выйти из текущей папки на уровень выше.

3. Файлы размещаются в разных папках (рис. 8.6).

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

Ссылка

Аналогично обстоит дело с любым числом вложенных папок.

4. Файлы размещаются в разных папках (рис. 8.7).

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

Ссылка

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

Ссылка

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

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

Учтите, что такая форма записи не работает на локальном компьютере, а только под управлением веб-сервера.

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


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

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

Из этой статьи мы узнаем:

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

Пути к файлам на сервере

Абсолютный путь для сервера - это полный путь от корня до скрипта. Узнать полный путь скрипта можно с помощью "волшебной" константы __FILE__ :

В зависимости от операционной системы результат может различаться:

D:\OpenServer\domains\сайт\index.php - для OpenServer на Windows

/var/www/сайт/index.php - для UNIX

Разумеется, функция include() и её аналоги могут подключить файл по его абсолютному пути:

Относительный путь для сервера - это путь от папки, в которой находится текущий скрипт. Представим, что на нашем сайте лежат 2 скрипта: index.php и config.php . Тогда подключить второй из первого можно с помощью как абсолютного, так и относительного пути:

Пока что всё просто. Но если мы решим подключить файл, который сам подключает какой-то другой файл, ситуация станет немного сложней. Представим, что у нас появилась папка scripts со скриптами script1.php и script2.php , структура для наглядности:

Index.php scripts script1.php script2.php

Содержимое файлов будет таким:

Запустите в браузере файл index.php. Если всё сделано правильно, то отобразится надпись Подключение удалось . А теперь попробуйте перенести файл script2.php в корень сайта, на один уровень с index.php .

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

Навигация по относительным путям.

Заметьте, что относительные пути никогда не начинаются со слеша / . Если слеш в начале есть, PHP посчитает путь абсолютным.

folder1/folder2/folder3/script1.php - поиск файла в подпапке

../index.php - переход на одну папку вверх

../../../index.php - переход на 3 папки вверх

Как указывать путь к файлу на сервере?

Забудьте про относительные пути. Всегда указывайте только абсолютные пути к файлам. Радикально, да? Не волнуйтесь, PHP-сообщество придумало 2 простых (есть ещё и непростые:)) способа указать полный путь... не указывая полный путь.

Первый способ - использование функции dirname() . Она принимает путь к файлу и возвращает путь без имени файла, т.е. папку, в которой файл лежит. Совместив __FILE__ и dirname() мы можем получить папку текущего скрипта:

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

Второй способ - использование констант. Он используется во многих популярных CMS и выглядит следующим образом:

Создаётся константа DIR_ROOT , в которой мы будем хранить полный путь к корневой папке сайта. Также по желанию можно создать множество констант со ссылками на часто используемые папки. В include() передаём константу и относительно неё добавляется путь к нужному файлу.

Пути к файлам в браузере

Браузер не имеет доступа к жёсткому диску вашего сервера. Его "область видимости" начинается с корневой папки сайта. Поэтому абсолютный и относительный путь для сервера и для браузера выглядят абсолютно по-разному.

Абсолютный путь к файлу в браузере начинается со слеша / , например /images/logo.jpg . Этот путь означает, что файл расположен по адресу site.ru/images/logo.jpg .

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

Частая ошибка новичков - использование относительного пути вместо абсолютного. Представим, что логотип сайта находится по адресу site.ru/images/logo.jpg . Попробуем его подключить по относительному пути:

Вроде бы всё хорошо и работает. Но так будет до тех пор, пока пользователь не перейдёт в какую-нибудь папку, например site.ru/products/15/ . Как вы догадываетесь, браузер будет пытаться загрузить лого по адресу site.ru/products/15/images/logo.jpg .

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







2024 © gtavrl.ru.