Полезной особенностью включаемых файлов PHP является то, что они могут быть расположены в любом месте, если страница с командой include знает, где их найти. Включаемые файлы даже не обязательно должны находиться в корневом каталоге веб-сервера. Это означает, что можно защитить включаемые файлы, содержащие конфиденциальную информацию, такую как пароли, в частных директориях (папках), которые не могут быть доступны через браузер.

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

Оператор include ожидает относительный путь или полный путь. Если ни один не задан, PHP автоматически проверяет include_path определенный в конфигурации PHP. В следующем разделе объясняется, как изменить папки, в которых PHP автоматически выполняет поиск включаемых файлов.

Настройка include_path

Преимущество размещения включаемых файлов в папке, указанной в переменной веб-сервера include_path заключается в том, что не нужно беспокоиться о том, являются ли правильными относительный или абсолютный путь. Все что нужно это имя файла. Это может быть очень полезно, если используется много операторов include или иерархия сайта состоит из нескольких уровней. Существует три способа изменения include_path:

  • Изменить значения в php.ini: Если хостинг-компания предоставляет вам доступ к php.ini, это лучший способ добавить пользовательскую папку включаемых файлов.
  • Использовать .htaccess:. Если удаленный веб-сервер работает на Apache, и вы можете изменить конфигурацию с помощью .htaccess файла, это хорошая альтернатива.
  • Использовать set_include_path(): Используйте этот способ только тогда, когда предыдущие варианты не доступны, потому что функция влияет только на include_path для текущего файла.

Значение include_path для веб-сервера значится в разделе Core в сведениях о конфигурации при запуске phpinfo(). Как правило, путь начинается с точки, которая означает текущую папку, и далее следует абсолютный путь каждой папки для поиска. В Linux и Mac OS X, каждый путь разделен двоеточием. В Windows разделитель точка с запятой.

На сервере под Linux или Mac текущая директива include_path может выглядеть следующим образом:

 .:/php/PEAR 

На сервере Windows эквивалент выглядит следующим образом.

 .;C:phpPEAR 

Редактирование include_path в php.ini

В php.ini найдите директиву include_path. Чтобы добавить папку includes на вашем сайте, добавьте к концу текущего значения двоеточие или точку с запятой, в зависимости операционной системы вашего сервера, далее следует абсолютный путь к папке includes.

На сервере под Linux или Mac используйте двоеточие:

 include_path=".:/php/PEAR:/home/mysite/public_html/includes" 

На сервере под Windows используйте точку с запятой:

 include_path=".;C:phpPEAR;C:sitesmysitewwwincludes" 

Использование .htaccess для изменения include_path

Если можно воспользоваться .htaccess для изменения конфигурации сервера, настройте include_path на Linux или Mac следующим образом:

 php_value include_path ".:/php/PEAR:/home/mysite/public_html/includes" 

В операционной системе Windows команда выглядит также, за исключением того, что пути отделяются точкой с запятой.

 php_value include_path ".;C:phpPEAR;C:sitesmysitewwwincludes" 

Не вставляйте знак равенства между include_path и списоком имен. Поскольку .htaccess переопределяет include_path по умолчанию, убедитесь, что вы сделали копию существующего значения из phpinfo() и добавили новый путь к нему.

Лучше всего создавать файл .htaccess на локальном компьютере с помощью специальной программы для веб разработки, такой как Dreamweaver или Zend Studio. При создании файла .htaccess в текстовом редакторе на Mac, он исчезнет без следа в Finder. Операционная система Mac OS X имеет неприятное свойство скрывать файлы с именами, которые начинаются с точки. Целевые программы для веб-разработки более понятливые.

Использование set_include_path()

Хотя set_include_path() влияет только на текущую страницу, вы можете легко создать фрагмент кода и вставить его на страницы, где хотите его использовать. В PHP также легко можно получать текущее значение include_path и объединять его с новым путём, независимо от платформы.

Сохраните новый путь в переменной, а затем объедините его с текущим путём подключения файлов следующим образом:

</p>
<p style="text-align: justify;">$includes_folder = '/home/mysite/public_html/includes';
set_include_path(get_include_path() . PATH_SEPARATOR . $includes_folder);</p>
<p style="text-align: justify;">

На первый взгляд похоже, что в функцию set_include_path() передаются три аргумента, но это только один аргумент, потому что три элемента соединяются оператором конкатенации (точка), а не запятыми. Как вы уже поняли функция get_include_path() получает текущий include_path. Строка PATH_SEPARATOR является константой PHP, которая автоматически вставляет двоеточие или точку с запятой в зависимости от операционной системы. В результате строка содержит первоначальный и новый путь.

Проблема с данным подходом заключается в том, что путь к новой папке includes будет разным на удаленном и локальном сервере тестирования. К счастью, это можно исправить с помощью условного оператора. Суперглобальная переменная $_SERVER['HTTP_HOST'] содержит доменное имя сайта. Итак, если ваш домен www.example.com, вы можете установить правильный путь для каждого сервера следующим образом:

</p>
<p style="text-align: justify;">if ($_SERVER['HTTP_HOST'] == 'www.example.com') {
$includes_folder = '/home/example/public_html/includes';
} else {
$includes_folder = 'C:/xampp/htdocs/mysite/includes';
}
set_include_path(get_include_path() . PATH_SEPARATOR . $includes_folder);</p>
<p style="text-align: justify;">

Вероятно, не стоит использовать функцию set_include_path() для небольших сайтов, которые не используют много включаемых файлов. Где функция действительно полезна, так это при использовании сторонних библиотек PHP, таких, как Zend Framework (http://framework.zend.com/) или Symfony (www.symfony-project.org), которые опираются на включаемые файлы.

Почему нельзя использовать ссылки относительно корня сайта при включении файлов в PHP?

Ответ — и да и нет. Для ясности, начнем с объяснения различий между ссылками по отношению к документу и к корневому каталогу сайта. При нажатии на ссылку для перехода на другую страницу, путь в теге сообщает браузеру, как добраться от текущей страницы к следующей. Большинство веб-инструментов разработки указывают путь относительно текущего документа. Если целевая страница находится в той же папке, используется только имя файла. Если страница на один уровень выше, чем текущая, перед именем файла ставится ../. Это известно как путь относительно документа или ссылка. Если сайт содержит много уровней папок, такой тип ссылок тяжело понять, по крайней мере, для людей.

Другой тип ссылки всегда начинается с косой черты, которая кратко обозначает корневой каталог сайта. Преимуществом пути относительно корня сайта является то, что положение текущей страницы в иерархии сайта не имеет значения, косая черта в начале пути гарантирует, что веб-сервер начнет поиск с верхнего уровня сайта. Хотя ссылки относительно корня сайта гораздо легче читать, операторы include в PHP не могут их обрабатывать. Вы должны использовать путь относительно документа, абсолютный путь, или указать папку includes в директиве include_path.

Необходимо сказать, что можно преобразовать путь относительно корня сайта в абсолютный путь, присоединив значение суперглобальной переменной $_SERVER['DOCUMENT_ROOT'] к началу пути, как в следующем примере:

 include($_SERVER['DOCUMENT_ROOT'] . '/includes/filename.php'); 

Большинство серверов поддерживают $_SERVER['DOCUMENT_ROOT'], но вы должны для надёжности проверить раздел PHP Varaibles в нижней части деталей конфигурации отображаемых phpinfo()

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

Безопасность и включаемые файлы

Включаемые файлы очень мощная особенность PHP. С этой мощью появляются серьезные риски безопасности. Если внешний файл доступен, PHP подключает его и внедряет любой код в основной сценарий. Но, как уже упоминалось в предыдущем разделе, включаемые файлы могут быть расположены в любом месте. Технически говоря, они могут быть даже на другом сервере. Однако, учитывая риск безопасности, в PHP 5.2, была введена новая директива конфигурации allow_url_include. По умолчанию она отключена (Off), поэтому теперь невозможно включить файлы с другого сервера, если только у вас нет полного контроля конфигурации сервера. В отличие от include_path, директива allow_url_include может быть изменена только администратором сервера.

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