Статьи  : 

Абсолютная адресация страниц

20 марта 2013, 14:08

Одна из типичных ошибок при разработке сайтов – создание относительной адресации вместо абсолютной (когда явно не используется адрес сайта). Для сравнения:

относительная адресация:
<a href="project.php?link=web-razrabotka">веб-разработка</a>


абсолютная адресация:
<a href="http://site.ru/project.php?link=web-razrabotka">веб-разработка</a>


Конечно, первый вариант тоже имеет право на жизнь. Но – ровно до тех пор, пока вы не заходите сделать красивые url вида http://site.ru/projects/web-razrabotka ). На этом месте сразу же начнутся проблемы, так как все относительные ссылки в теле страницы станут уже отсчитываться не от корня сайта, а от текущего адреса, и просто перестанут работать. Очевидный вывод – сразу делать всё в абсолютных ссылках.

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

Посмотрим, как это выглядит на практике:

в самый верх скрипта:
// функция для преобразования старых относительных ссылок в новые абсолютные
function convert_links($buffer)
{
	// здесь правила преобразования ссылок (сколько потребуется)
	$output = str_replace('старая ссылка', 'новая ссылка', $buffer);
	return $output;
}

// включаем кэширование
ob_start("convert_links");


и в самый низ скрипта:
// выдаем страницу с обработанными ссылками в браузер
ob_end_flush();


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

P.S. Приведем еще один довод, почему внутри проекта следует делать все ссылки (на страницы, картинки, яваскрипты и т.д.) абсолютными.

Предположим, мы разрабатывает систему для очередного заказа. На локальном компьютере данная система имеет адрес http://site.ru. Пусть в теле страницы стоит относительная ссылка на картинку: img src="/img/pict.jpg". Локально вроде бы все хорошо, и картинка грузится. Но что произойдет, когда мы перенесем систему на тестовый сервер в виде http://our-test-server.ru/site/ ? (чтобы заказчик мог следить за ходом работы)

Посмотрим, какой будет путь у нашей картинки: http://our-test-server.ru/img/pict.jpg

Хотя правильный путь должен быть: http://our-test-server.ru/site/img/pict.jpg

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