Настройка open_basedir на примере VestaCP
В некоторых панелях управления сервером, например VestaCP по-умолчанию директива open_basedir настроена только на запуск php-скриптов внутри директории public_html у домена. Но т.к. ради безопасности нам необходимо разместить файлы проекта выше www, то open_basedir необходимо перенастроить. В противном случае, мы постоянно будем получать ошибку вида File . is not within the allowed path(s).
Можно поменять настройку в основном php.ini распрстранив, таким образом, изменения на весь сервер. Если вы забыли где лежит файл конфигурации то воспользуйтесь командой
$ php -i | grep php.ini
Допустим, нас интересует решение для конкретного домена, а не сервера целиком. На форуме весты есть такое решение: создайте в дополнительный конфигурационный файл /home/%user%/conf/web/httpd.%domain%.conf в котором будет прописано:
php_admin_value open_basedir none
Но полностью отключать настройку не всегда безопасно, к тому же, если присмотреться, то в директории /home/%user%/conf/web/ можно найти файл apache2.conf
Открываем его, например, с помощью nano (не забывайте добавлять папаметр -w при открытии конфигурационных файлов)
nano -w home/user/conf/web/apache2.conf
В нём в разделе Directory есть строчка вида
php_admin_value open_basedir /home/user/web/domain/public_html:/home/user/tmp
Здесь указано 2 разрешённых пути, двоеточие — это разделитель между ними. Например, мы хотим разрешить выполнение php в папке project на один уровень выше веб-директории public_html, тогда добавляем в конце строки:
:/home/user/web/domain/project
Сохраняем изменения Ctrl+O, выходим Ctrl+X. Теперь перезапустим апач что бы новые настройки вступили в силу:
etc/init.d/apache2 restart
Всё готово, если что-то не работает ищите опечатку.
Для чего нужна и как использовать open_basedir
Директива open_basedir указывается в конфигурационном файле PHP (php.ini) и устанавливает директории, к которым может иметь доступ PHP. Под доступом понимаются любые действия с файлами: открытие (например, функции fopen() или gzopen()), записи и выполнения. Если директива open_basedir установлена и делается попытка запустить файл, который находится за пределами перечисленных директорий, то скрипт не запустится и выдаст ошибку:
[Wed Apr 1 13:11:34 2020] PHP Warning: Unknown: open_basedir restriction in effect. File(/usr/share/seeker/template/nearyou/php/info.php) is not within the allowed path(s): (/srv/http/:/etc/webapps/:/usr/share/webapps/:/tmp/:/home/mial/) in Unknown on line 0
Пример значения open_basedir:
open_basedir = /srv/http/:/etc/webapps/:/usr/share/webapps/:/tmp/:/home/mial/
В указанном примере разрешён запуск скриптов PHP, а также операции с файлами в директориях:
- /srv/http/
- /etc/webapps/
- /usr/share/webapps/
- /tmp/
- /home/mial/
Директива open_basedir оказывает влияние на многие функции. Больше всего в ней смысла при использовании на уровне конфигурационных файлов веб-сервера на уровне директорий или виртуальных хостов.
По умолчанию, если значение open_basedir не установлено, разрешены файловые операции в любых директориях компьютера (на которые достаточно прав).
Опция open_basedir может распространяться не только на функции для работы с файловой системой; например, если MySQL настроен использовать драйвер mysqlnd, то LOAD DATA INFILE подпадает под опцию open_basedir . Множество функций PHP также использует open_basedir.
Специальное значение . (точка) обозначает, что рабочая директория скрипта будет использована в качестве базовой директории. Однако, это немного опасно, так как текущая директория скрипта может быть легко изменена с помощью chdir().
В httpd.conf, open_basedir может быть выключена (например, для некоторых виртуальных хостов) тем же способом, что и любая другая конфигурационная директива:
php_admin_value open_basedir none
В Windows разделяйте директории символом ; (точкой с запятой). На всех остальных системах, разделяйте директории символом : (двоеточием). При работе в качестве модуля Apache, пути open_basedir автоматически наследуются от родительских директорий.
Связанные статьи:
- Что делать если PHP скрипту не хватает времени и памяти. Почему большой файл не загружается на сайт или в phpMyAdmin (100%)
- Почему не работают короткие теги в PHP (100%)
- Как изменить количество цифр после запятой в PHP. Как увеличить точность вычислений в PHP (100%)
- Как и какие функции отключить в PHP (100%)
- Как установить веб-сервер Apache с PHP, MySQL и phpMyAdmin на Windows (100%)
- Как тестировать отправку писем в PHP на Windows (RANDOM — 75%)
Hestia CP: Отключение функции open_basedir
При возникновении на сайте проблемы с загрузкой страниц связанных с функцией open_basedir, о чем свидетельствует ошибка open_basedir restriction in effect (может возникать как на страницах сайта, так и только в [логах ошибок] на сервере) можно отключить эту функцию.
Если коротко, функция open_basedir ограничивает доступ с php скриптов сайта к другим скриптам и каталогам, которые находятся за пределами сайта. Основное ее предназначение изолировать сайты друг от друга, чтобы каждый сайт «видел» только файлы/каталоги своей корневой директории, и не вмешивался в работу других сайтов/каталогов.
Данное руководство актуально только для панели управления Hestia, для других панелей или типов серверов она может быть не актуальна. Перед началом работ, убедитесь, что вы сделали [снапшот сервера]. Все операции производятся на страх и риск владельца сервера.
Следовательно, нужно в темплейт конфиг файле закомментировать строку, имеющую отношение к этой функции. Темплейт файлы располагаются по пути /usr/local/hestia/data/templates/web/php-fpm/ и имеют имена схожие с версиями PHP, для которых нужно отключить open_basedir. Для примера, темплейт для версии PHP 7.4 имеет название PHP-7_4.tpl
В данном файле есть строка php_admin_value[open_basedir] = . наша цель его закомментировать, добавив символ точки с запятой в начало строки, чтобы получилось вот так ; php_admin_value[open_basedir] = .
Для этого можете воспользоваться любым редактором файлов, например nano или vim, или выполните следующую команду, она найдет нужную строку и закомментирует ее. Обратите внимание на имя файла в команде, если у вас другая версия PHP, то не забудьте изменить имя файла, поскольку следующий пример предназначен для PHP 7.4.
sed -i ‘s/php_admin_value\[open_basedir\]/;php_admin_value\[open_basedir\]/g’ /usr/local/hestia/data/templates/web/php-fpm/ PHP-7_4.tpl
Осталось записать изменения с темплейта в основной конфиг сайта и перезагрузить службу PHP 7.4, все это можно сделать как вручную через панель управления и файлы панели, так можно выполнить всего одну команду. Обратите внимание, в команде есть 3 переменные, имя пользователя (admin) панели управления где размещается сайт, домен сайта (example.pp.ua), и название темплейта (PHP-7_4), который мы редактировали выше. Как и в случае выше, измените эти данные в соответствии со своими, прежде чем запускать команду.
v-change-web-domain-backend-tpl admin example.pp.ua PHP-7_4
Готово.
Теперь можно проверить, отключена ли функция с помощью [проверочного php скрипта phpinfo].
Вот как выглядит включенная функция open_basedir (первый скриншот) и когда она выключена (второй скриншот)


Все категории вопросов
- Общие вопросы по услуге хостинга
- Робота с хостинг 2.0
- Работа с базами данных [MySQL]
- Работа с FTP
- Работа с SSH
- Работа с почтой
- Работа с Cron
- Работа с SSL
- Работа с резервным копированием
- Работа с htaccess
- Работа с CMS
- Дополнительные услуги
- Нагрузка
- Ошибки на сайте
- Конструктор сайтов
- Регистрация и продление доменов
- Управление DNS-записями домена
- Трансфер домена
- Смена контактных данных владельца домена
- Настройка CloudFlare
- Общие вопросы по серверам
- Администрирование виртуального сервера (VPS)
- Администрирование выделенного сервера (DS)
- Инструкции по Windows Server
- Инструкции по Linux
- Панель управления FASTPANEL
- Панель управления Hestia CP
- Панель управления Vesta CP
- Платный SSL-сертификат
- Файловое хранилище
- SMS-сервис
- CallBack-сервис
Ошибка open_basedir restriction in effect. File() is not within the allowed path(s)

isFile(): open_basedir restriction in effect. File(gantry-themes:/\beez3) is not within the allowed path(s): (e:/htdocs;e:/ospanel/userdata/temp;e:/ospanel/modules/system/html/openserver;e:/ospanel/modules/php/PHP-5.6)
Или такой вариант
is_dir(): open_basedir restriction in effect
Warning: is_dir(): open_basedir restriction in effect.
File(/plugins/system/nrframework/language)
is not within the allowed path(s): (e:/htdocs;e:/ospanel/userdata/temp;e:/ospanel/modules/system/html/openserver;e:/ospanel/modules/php/PHP-7.0-x64)
in E:\htdocs\localhost\js_kampre\plugins\system\nrframework\NRFramework\Functions.php
on line 383
или такая ошибка
is_writeable(): open_basedir restriction in effect
Warning: is_writeable(): open_basedir restriction in effect. File(/home/u2518645671/public_html/tmp)
или такой вариант
file_exists(): open_basedir restriction in effect
Warning: file_exists() [function.file-exists]:
open_basedir restriction in effect. File(/home/user_name/public_html/wp-content/uploads/2006/12/picture.jpg)
вот ещё один случай:
JFolder::create: Path not in open_basedir paths Unable to create destination
Причины возникновения этой проблемы одинаковые (кроме последнего примера), несмотря на немного разные сообщения об ошибках ⇒ Это меры безопасности на хостинге, сервере, VDS и т.д.
PHP функция open_basedir предотвращает работу (открытие) файлов и скриптов, которые находится вне разрешённый настроками сервера, директории. Если эти open_basedir ограничения включены, то все неавторизованные пользователи получают разрешения и доступ только к разрешённым в настройках папкам на сервере.
Если функция или скрипт пробует открыть (записать в файл), который находится вне папок, куда можно лезть, тогда PHP откажется выполнять это действие и появится ошибка о которой мы говорим open_basedir restriction in effect
⇒ Разберём варианты её решения.
Решение 1 ⇒ отменяем / отключаем open_basedir
1 Отменяем все ограничения open_basedir и открываем доступ ко всем директориям, указав значение
open_basedir = none
Отменяем все ограничения open_basedir и открываем доступ ко всем директориям, указав значение
open_basedir = none
2 Это можно сделать в настройках Апача
Открываем файл настроек (в зависимости от хостинга и настроек сервера) httpd.conf
vhost.conf
vhost_ssl.conf
httpd.conf
default.tpl для Vesta
для ISPmanager4 нужно править:
/usr/local/etc/apache22/httpd.conf если используете FreeBSD
/etc/httpd/apache.conf если операционка Debian
/etc/apache/conf/apache.conf если ОС CentOS
для ISPmanager5 правим в:
/etc/apache2/vhosts/пользователь/доменное имя сайта
и для параметра
php_admin_value open_basedir
устанавливаем значение none
Решение 2 ⇒ отменяем / отключаем open_basedir в файле PHP.ini
3 Отключить ( закомментировать строку ):
в файле PHP.ini или в одном из вариантов вида: PHP-5.6_php.ini
! Внимание! НО
➡ этот вариант быстрый, но не безопасный,
Поэтому, переходим к ➡
Решение 3 ⇒ отменяем ограничения в доступе для некоторых папок
4 Не отключаем PHP функцию open_basedir, а добавляем в разрешённые нужные вам папки, например
если ошибки указывают на папку /language/, добавим её в список папок к которым доступ разрешён.
Делается это так:
В настройках Apache ищем строку
php_admin_value open_basedir
и добавляем нужную нам директорию через двоеточие
Например /usr/lib/php:/usr/local/lib/php:/home/user_account/:/usr/lib/php:/usr/local/lib/php:/tmp:/new_directory/:/new_directory/
Для локального windows сервера эти настройки будут немного другими (точка с запятою вместо двоеточия)
open_basedir = C:\Windows\TEMP;E:\htdocs\localhost\js_kampre\plugins\system\nrframework\language\
Решение 4 для случая ⇒ JFolder::create: Path not in open_basedir paths
или в русскоязычном варианте:
Решение 4 для случая ⇒ JFolder::create: Путь не в пределах значения переменной open_basedir
или ещё вариант:
Решение 4 для случая ⇒ JFolder::create: Не удалось создать каталог, Внимание! Не удалось переместить файл!
5 Причина ошибки JFolder::create: Path not in open_basedir paths Unable to create destination более простая и банальная. Возникает при попытке установить компонент, модуль. Она возникает после переноса или перезда сайта на другой сервер / хостинг и связана с неверно прописанным в конфиге (configuration.php) путем к папке TEMP ( например на локали это будет так public $tmp_path = ‘E:\\htdocs\\localhost\\js_kampre/tmp’; , а на сервере хостинга public $tmp_path = ‘/var/www/. /data/www/vash-sait.ru/tmp’; ).
6 Проверить всё ли хорошо с вашими настройками после перезда сайта на другой хостинг можно в панели Администратора.
Система >> Информация о системе, вкладка «Права доступа на каталоги», найдите папки:
/tmp (Каталог для временных файлов)
/logs (Каталог файлов лога)
Проверьте для них правильность путей и прав.
Если что то не так ➡ Правим configuration.php или, что для кого то проще,
Система >> Общие настройки >>Система >> Сервер
правим
путь к каталогу временных файлов.
Сохраняем.
Если не помогло, то ➡
7 Это решение для старых версий Joomla 1.5.x
Ищем файл /libraries/joomla/filesystem/folder.php и в нём отключем / комментируем строку $obd = ini_get(‘open_basedir’);
Хотя это не самый лучший вариант решения .
8 Это решение для старых версий Joomla 1.5.x
Ищем файл /libraries/joomla/filesystem/folder.php и в нём меняем в строке
public static function create($path = », $mode = 0755)
права с 0755 на 0770
Если не получилось, то ➡
9 Проверяем архив, который вы ставите. Там может быть неверная или вложенная папка с файлами.
Распаковываем — проверяем. Перезапаковываем архив и устанавливаем снова.
Если не сработало, то ➡
10 Закачиваем установочные файлы не со своего компьютера, как это делается обычно, а с директории tmp в корневой папке Joomla. (Этот вариант много раз «спасал» )
Другими словами: сначала закачиваем нужные файлы со своего компьютера в директорию /tmp/ и затем Установку расширения производим выбирая в настройках
Установить из каталога
и там пусть такого вида /var/www/. /data/www/vash-sait.ru/tmp/
Разумеется, каталог /tmp/ должен быть доступен на запись! (как и другие каталоги, в которые новое дополнение будет устанавливаться )
11 Если вы используете на своём сайте RSFirewall, то он создаёт или пытается создать свой собственный php.ini настройки open_basedir и изменить configuration.php, поэтому RSFirewall тоже может создавать дополнительные ограничения. Подробнее
Ни что не помогло ? ➡
12 Проверяем, на всякий случай, файл .htaccess в корне сайта. Там могут быть указаны дополнительные настройки для open_basedir. Проверяем их и правим