Беда с путями и урлами у программистов


Имея более чем 10-летний опыт и наблюдая за 5 летними программистами и верстальщиками часто вижу что они все равно не разбираются в путях и урлах!! 
И это действительно беда!!!

Поэтому решил написать данную статью чтобы расставить точки над i!

Для начала нужно разделить

ссылки (далее URL или урл)

и

пути к папкам и файлам на сервере (далее путь)!


К примеру:

1.html - может быть как путь так и ссылка
C:\\webservers\home\test1.loc\www\index.php - это однозначно путь!
http://test1.loc/index.php - а это однозначно ссылка!

НАЧНЕМ С ССЫЛОК!



Сразу проясним, что ссылки платформонезависимы, в отличие от путей. То есть не важно на маке или на линуксе или на винде, ссылки не зависят от ОС (в отличие от путей).

Рассмотрим пример самой простой ссылки, допустим на находимся по адресу: http://test1.loc/1.html и нам нужно сделать ссылку на файл 2.html, то в таком случае ссылку можно вполне указать таким образом:
2.html
Это называется относительная ссылка, потому-что она указывается относительно нашего местоположения.
Поясню:
- сейчас мы находимся по адресу: http://test1.loc/1.html  а ссылка 2.html в итоге будет вести на адрес: http://test1.loc/2.html, 
- если бы мы находились по адресу: http://test2.loc/1.html а ссылка 2.html в итоге будет вести на адрес: http://test2.loc/2.html,
- если бы мы находились по адресу: http://test2.loc/3/1.html а ссылка 2.html в итоге будет вести на адрес: http://test2.loc/3/2.html,
- если бы мы находились по адресу: http://test2.loc/3/4/5/6/1.html  а ссылка 2.html в итоге будет вести на адрес: http://test2.loc/3/4/5/6/2.html,

Надеюсь суть уловили, то есть заменяется только последняя часть полного адреса, его также называют абсолютным адресом, он же и абсолютная ссылка. ТО есть абсолютная ссылка - это ссылка с адресом сайта (с доменом).

Кстати, не будем рассматривать адреса (ссылки) по протоколу file:// - это когда мы открываем html файл (он же верстка) для просмотра без сервера, например так выглядит ссылка на файл на рабочем столе: 
file:///C:/Users/sympler/Desktop/мой-супер-проект/index.html
но никогда такие ссылки не надо вставлять и на практике я их пока нигде не применял, поэтому и в разъяснениях такие ссылки я не рассматриваю (то есть считаю исключением из правил).

Теперь вернемся к примерам:
- находимся мы по адресу: http://test2.loc/1.html и нужно указать ссылку на файл good.html который находится в папке 'articles', относительная ссылка будет выглядеть так: articles/good.html, а полная (абсолютная) ссылка http://test2.loc/articles/good.html
- находимся мы по адресу: http://test2.loc/articles/good.html и нужно указать ссылку на файл 1.html который находится на уровень выше, относительная ссылка будет выглядеть так: ../1.html, а полная (абсолютная) ссылка  http://test2.loc/1.html

То есть чтобы подняться на уровень выше, нужно указать две точки со слешем: ../ 
Соответственно на 2 уровня выше: ../../
На три уровня выше: ../../../


Кстати, относительные ссылки и удобны тем, что в них не указан адрес сайта и соответственно при смене адреса сайта не нужно будет везде менять ссылки. Отметим, что это очень актуально для домашних заданий наших учеников которые делают работу у себя локально на домене, например, x5.loc, а наставник у себя проверяет на домене x2000.loc и скрипт по этой причине может не работать, не говоря о случаях, когда ученик скрипт размещал в корне домена, а наставник в подпапке разместил.
Но тот же torrents.ru, который закрыли, и когда они купили новый домен rutracker.org - просто переносом файлов и заменой логотипа не обошелася, еще несколько дней они вручную меняли ссылки чтобы все работало, а вот проблем с переездом из kaliningrad.ru на newkaliningrad.ru я лично не заметил, хотя возможно им сделать было проще пробежавшись по всем файлам и записям в базе данных заменив старый адрес на новый.

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


Также обращаю внимание на рекомендуемые символы, которые можно использовать в ссылках: 
цифры [0-9], латиница в нижнем регистре [a-z], точка[.], слеш [/], дефис [-], нижнее подчеркивание [_], вопрос [?], амперсанд [&]

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

И еще полезная статья, заодно немного проясните для себя задание по транслитерации.

http://habrahabr.ru/post/66931/


ИДЕМ ДАЛЬШЕ



Cсылки (они же URL) вставляются в тег A, а точнее в его атрибут HREF, а пути сюда точно не вставляются!

кстати если начинать относительные ссылки со слеша, то они являются полуотносительными, но относительно адреса сайта, то есть ссылка /articles.html
в итоге будет конвертироваться в http://test1.loc/articles.html и не важно на каком мы сейчас уровне, 
соответственно ссылка / (просто слеш) - это ссылка на главную страницу, то есть на адрес сайта без страницы: http://test1.loc/ - он же аналогичен адресу без слеша на конце.
Именно этот способ чаще всего используется при указании ссылок, то есть указываются полуотносительные ссылки!!!

Стоит заменить что есть ли слеш на конце урла или нет - большая разница, за исключением главной страницы, поскольку страницы: http://test1.loc/4444 и http://test1.loc/4444/ это разные страницы, если не включен mod_rewrite то первая ссылка ведет на файл 4444 (да, бывают файлы без расширения), а втором случае ссылка ведет на папку 4444, а точнее на файл index.html в папке 4444, то есть если указана папка, то открывается файл по умолчанию index.html, если его нет, то показывается список файлов в этой папке (если это не отключено из-за безопасности, на OpenServer отключено). Аналогично если указывается адрес сайта без файла: http://test1.loc то открывается файл http://test1.loc/index.html или http://test1.loc/index.php тут уж как настроен денвер (точнее его компонент apache)

В некоторых проектах (userCMS например) слеш на конце всегда убирается, в некоторых по этому поводу полная неразбериха и дублирование страниц (Wordpress, Joomla).

НЕМНОГО О MOD_REWRITE


Модрерайт - это модуль апача, он переписывает урлы. То есть вводя адрес: http://test2000.loc/3333.html на самом деле может открываться файл 8888.html или 7777.php, ну то есть любой. 
Чаще всего указываются такие правила: 
-для ссылок вида xxxxx.html подгружать файл article.php?page=xxxxx
-для ссылок вида yyyyy/xxxxx.html подгружать файл article.php?dir=yyyyy&page=xxxxx

а еще чаще: 
для любой ссылки подгружать index.php
Так реализовано в большинстве cms  и cmf
Поэтому, когда видите адрес: site.ru/news/ - то скорее всего никакой папки news на сервере нет.
Эти правила записываются в файле .htaccess. Подробнее про него http://www.htaccess.net.ru/


ПЕРЕХОДИМ К ПУТЯМ



Теперь настало время разобраться с путями.
Рассмотрим примеры (кавычки опущены для читабельности):

file_get_contents(1.txt);

в данном случае мы обращаемся к файлу 1.txt - и путь к нему относительный, и относительно скрипта php из которого мы вызываем данную функцию.
Но иногда для линукс серверов правильнее будет обращаться так:

file_get_contents(./1.txt);

соответственно для файлов в папках: 
file_get_contents(./dir/dir/1.txt);

Стоит заметить, что прямой слеш /, для линукс(unix) систем родной, как и для мака, а вот в виндовс пути разделяются обратным слешем \. Но при этом с прямым слешем функции работают верно, например, file_get_contents(./dir/dir/1.txt); в виндовс не вызовет ошибку, даже такой вызов: file_get_contents(C://users/sony/desktop/1.txt); - не вызовет ошибку и сможет открыть файл на рабочем столе (при наличии системных прав).
В идеале, для полной совместимости существует константа: DIRECTORY_SEPARATOR которая в линуксе содержит / , а в Windows - \, можно самому создать такую константу или переменную, обычно ее называют сокращенно: DS

Для перехода наверх, также как в ссылках используются две точки:

file_get_contents(../../dir/dir/1.txt);
opendir('../../articles/');
fopen('../my.xml');

ПОЛУОТНОСИТЕЛЬНЫЕ=АБСОЛЮТНЫЕ ПУТИ



а что же будет если мы укажем путь начиная со слеша:
file_get_contents(/1.txt);
Тогда система попытается открыть файл: C:\\1.txt для виндовс систем и для OpenServer в частности, для линукс систем /1.txt


Соответсвенно попытка создать папку

mkdir('/articles');
создаст ее в C:\\articles
Правильно создавать: 
mkdir('./articles');

А попытка удалить папку 
rmdir('/home');
- это равноценно удалению C:\\home- он же C:\\home, а в линукс системе папка /home - аналогична папке C:\\Users

РЕКОМЕНДАЦИИ



Как же делают в проектах?
Какой же способ самый верный и надежный?
На самом деле все просто, в каждом проекте в начале скрипта создается константа с полным путем до корневой папки, обычно ее называют: ROOT_DIR
вот так она создается:

define('ROOT_DIR', dirname(__FILE__));

а потом вот так все пути прописываются:

file_get_contents(ROOT_DIR . '/dir/dir/1.txt');

АНАЛОГИЧНО со ссылками




define('SITE_URL', 'http://mybigproject.ru');

а потом вот так все ссылки прописываются (вставил лишние пробелы, думаю догадаетесь где):

< a href = "< ? = SITE_URL ;?> /my_link.html" >здесь < / a>

Пред. урок След. урок