#Симптомы, область применения и причины
При загрузке изображения PHP сообщает open_basedir restriction in effect. Как узнать фактические разрешённые пути, найти этап отказа и безопасно согласовать временный и постоянный каталоги. open_basedir ограничивает файловые пути процесса PHP и проверяет реальные каталоги; ошибка может возникнуть при чтении временного файла, создании миниатюры или перемещении в конечный каталог.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Каталог изображений вне разрешённого дереваФайл создаётся в каталоге, который не включён в open_basedir для пула. | В предупреждении указан путь назначения в другом дереве. | Перенести хранилище в разрешённое дерево либо добавить строго нужный путь. |
| Временный путь загрузки запрещёнPHP загружает файл во временную директорию, которую ограничивает open_basedir. | Файл не появляется даже до формирования миниатюры; путь в error_log указывает temp. | Выделить совместимый временный каталог только для этого приложения. |
| Символическая ссылка уводит за разрешённый путьПроверка open_basedir разрешает символьные ссылки до конечного пути. | Видимый путь внутри сайта, но конечный каталог ссылкой расположен снаружи. | Учитывать реальный путь или переместить данные без обхода ограничения. |
#Безопасная диагностика и пошаговое исправление
- Найдите конкретный запрещённый путьОткройте журнал PHP в панели сайта и найдите предупреждение
open_basedir restriction in effect, затем выпишите путь, на который ругается скрипт, и список разрешённых путей. Сравните предупреждение с моментом загрузки изображения. Не отправляйте в открытый чат полные пути, если в них содержатся имена учётных записей. Если сообщения нет, может срабатывать ошибка доступа к файлу другой природы — сначала запросите код загрузки.
- Определите этап отказаПопросите разработчика отдельно проверить: попал ли файл в
$_FILES, что содержит$_FILES[...]["error"], смог лиmove_uploaded_fileпереместить файл, не падает ли потом GD/Imagick при создании миниатюры. Если код загрузки 0, а ошибка появляется наimagecreatefromjpeg, нужно исследовать путь чтения изображения, а не менять лимиты POST. Нельзя считать любое сообщение загрузки ошибкой прав Unix.
- Посмотрите ограничения нужного обработчика PHPОткройте панель → нужный сайт → настройки PHP и найдите
open_basedir,upload_tmp_dir,sys_temp_dir. Если используется FPM с отдельным пулом, проверьте параметры пула иphp_admin_value[open_basedir]. Выводphp -iв SSH может отличаться от веб-обработчика, потому определяйте значение в закрытом маршруте PHP черезini_getи удаляйте отладку после проверки. - Временный код для закрытой диагностики веб-запросаPHPВременный код для закрытой диагностики веб-запроса. Не показывайте пути посетителям.
<?php error_log('open_basedir = '.ini_get('open_basedir')); error_log('upload_tmp_dir = '.ini_get('upload_tmp_dir')); error_log('sys_temp_dir = '.ini_get('sys_temp_dir'));
- Проверьте, где находится конечный каталогВ файловом менеджере панели найдите корень сайта и точное место для сохранения изображений. Если путь содержит символьную ссылку, откройте её свойства или попросите администратора определить настоящий путь: open_basedir контролирует конечную цель. Проверьте, существует ли каталог и может ли пользователь пула PHP-FPM в него писать. Не исправляйте путаницу отключением open_basedir для всех проектов.
- Сохраните копию настроек и выберите точечное решениеЕсли изображения должны храниться внутри корня приложения, предпочтительно перенести путь в разрешённое дерево и обновить конфигурацию приложения. Если требуются отдельные приватные каталоги хранения, согласуйте с администратором минимальное расширение
open_basedirтолько для данного пула. Не добавляйте/или всё/varради удобства — это почти сводит ограничение на нет. Для загрузок временная папка должна одновременно разрешаться PHP и быть доступна пользователю процесса.
- Проверьте параметры и примените штатным способомПосле сохранения исходного файла настроек проверьте синтаксис конфигурации соответствующего PHP-FPM (по версии и установленному исполняемому файлу) и примените изменения через панель или плавную перезагрузку нужного пула. Не изменяйте разделение пользователей на общем хостинге. Ошибка
php_admin_valueможет не сниматься в скрипте черезini_set, поэтому искать «обход» в коде бессмысленно.
- Загрузите изображение и проверьте все производные файлыС помощью тестовой учётной записи загрузите маленькую безопасную картинку без персональных данных. Проверьте появление оригинала и миниатюры и доступ по ожидаемому адресу. Затем повторите на другом разрешённом формате; если запись происходит, но обработчик изображений падает, проверьте фактический путь чтения и код GD/Imagick, а не открывайте все пути для файловой системы.
- Верните настройки при ухудшении доступаЕсли появились ошибки на других PHP-файлах, восстановите прежний
open_basedirиз копии и повторите проверку конфигурации до применения. Передайте специалисту обезличенные пути из предупреждения и точки выполнения кода. Временные изображения после неудачной загрузки удаляйте только через штатную процедуру приложения, не очищайте общую временную папку сервера.
#Как проверить результат и что делать дальше
Проблема устранена, когда тестовый файл и его миниатюра загружаются без предупреждений open_basedir, а ограничение по-прежнему не позволяет открывать посторонние каталоги. При сохранении ошибки уточните фактический путь с учётом ссылок и какой обработчик PHP выполнил запрос.