Беда с путями и URL на сайтах


Имея более чем 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/1.html,
- если бы мы находились по адресу: http://test2.loc/1.html  а ссылка 2.html в итоге будет вести на адрес: http://test2.loc/1.html,
- если бы мы находились по адресу: http://test2.loc/3/1.html  а ссылка 2.html в итоге будет вести на адрес: http://test2.loc/2/1.html,
- если бы мы находились по адресу: http://test2.loc/3/4/5/6/1.html  а ссылка 2.html в итоге будет вести на адрес: http://test2.loc/3/4/5/6/1.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 уровня выше: ../../
На три уровня выше: ../../../


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

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

Также обращаю внимание на символы, которые можно использовать в ссылках: официальный сайт и документация html и протокола http,
но рекомендуемые символы:

цифры [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, то есть если указана папка, то открывается файл по умолчанию index.html, если его нет, то показывается список файлов в этой папке (если это не отключено из-за безопасности, на денвере отключено). Аналогично если указывается адрес сайта без файла: 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?url=xxxxx
-для ссылок вида yyyyy/xxxxx.html подгружать файл article.php?url=xxxxx&category=yyyyy

а еще чаще:
для любой ссылки подгружать index.php
Так реализовано в большинстве cms  и cmf



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

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

file_get_contents(1.txt);

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

file_get_contents(./1.txt);

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

Стоит заметить, что слеш тоже обратный, для линукс систем он родной, как и для мака, а вот в виндовс пути разделяются обратным слешем. Но при этом с прямым слешем тоже все работаем верно, за редким исключением.
В идеале конечно для полной совместимости существует константа: DIRECTORY_SEPARATOR которая в линуксе содержит / , а в видне \, можно самому создать такую константу или переменную, обычно ее называют сокращенно: DS

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

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

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

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

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

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

А попытка удалить папку
rmdir('/home');
- это равноценно удалению Z:\\home- он же C:\\WebServers\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>





Как с нами связаться


Наш адрес
Гагарина 16г, офис 11А
+7 (4012) 33-55-81
center@unibix.ru
График работы
Пн - Пт: 1000 - 1900
Сб - по запросу
Вс: выходной
Мы в соцсетях
vk.com/unibix