Действует ограничение open_basedir. Файл (/) находится за пределами разрешенного пути (ей):


88

Я получаю эту ошибку при загрузке аватара на свой сайт. Я никогда не получал этого раньше, и в последнее время ничего не менялось, чтобы я начал получать эту ошибку ...

Warning: is_writable() [function.is-writable]: 
open_basedir restriction in effect. 
File(/) is not within the allowed path(s):

18
Вы приняли нерабочий ответ.
sjas

Ответы:


-22

Измените open_basedirнастройки в вашей конфигурации PHP (см. Конфигурация времени выполнения ).

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

Пример настроек, .htaccessесли PHP работает как модуль Apache в системе Linux:

<DirectoryMatch "/home/sites/site81/">
    php_admin_value open_basedir "/home/sites/site81/:/tmp/:/"
</DirectoryMatch>

2
@Nikesh Это дало мне ошибку 500 после того, как я бросил его в мое .htaccces и изменил пути к: /my/cutsom/dir/. Не уверен, почему подумал.
hitautodestruct

79
Круто, 12 голосов за неправильный ответ. Вы не можете использовать php_admin_valueв .htaccessфайлах . Вы не можете использовать DirectoryMatch в файлах .htaccess . (Какие были бы меры безопасности, open_basedirесли бы его можно было просто отключить?)
Альваро Гонсалес

1
@eoinoc - Прокрутите вниз и посмотрите, например, ответ Андрея. Или отредактируйте глобальный файл php.ini.
Álvaro González

19
ВЫ НЕ ЗАПОЛНЯЙТЕ ЭТО В СВОЙ HTACCESS! НО СКОЛЬКО В ВАШЕМ ФАЙЛЕ КОНФИГУРАЦИИ APACHE.
tfont

8
Включение корневого каталога в open_basedir полностью лишает цели open_basedir. Это решение «работает» только в том смысле, что фактически снимает ограничение.
Мартин

114

Измените настройки open_basedir в своей учетной записи хостинга и установите для них значение none. Найдите параметр open_basedir, указанный в области «Настройки PHP» вашего Plesk / cPanel. В раскрывающемся списке выберите значение «Нет». Я показал их на картинке панели Plesk.

введите описание изображения здесь введите описание изображения здесь


1
@yogihosting после этого у меня возникла ошибка - Невозможно найти указанную вами модель: Home_model
Heemanshu Bhalla

1
Немного поздно, но есть ли способ сделать это для всех сайтов plesk? Я установил значение none в глобальном php.ini для версии, которую используют сайты: gyazo.com/dfffbe7f9b3a20ede97da72f1ddfc777 Но они все равно получают ошибку.
Мэтт Коули,

@MattCowley, вы должны сделать это для каждого сайта, размещенного в панели plesk.
yogihosting

1
Очень полезный ответ, моя проблема решена Недурно :)
мухаммаданиш

1
Спасибо за это решение! Это идеально подходит для меня на виртуальном хостинге!
Smilefounder

38

Чтобы устранить эту ошибку, вы должны отредактировать файл httpd.conf. Задолго до того, как это можно будет увидеть в phpinfo в директиве раздела apache2handler Server Root. Например, в моем случае это - / etc / httpd / httpd.conf. Откройте файл httpd.conf, найдите упоминание о параметре open_basedir. И установите значение «Нет». ( php_admin_value open_basedir нет )


У меня сработала установка «нет» - тоже с использованием интерфейса Plesk.
diggersworld

8
Я нашел open_basedirконфигурацию в своем php.ini. (Arch Linux на Raspberry Pi с php 5)
Деннис ван дер Шагт,

2
Также нашел его в моем php.ini (также Arch). Просто закомментируйте строку, чтобы добиться того же эффекта, что и этот ответ.
Бен Элгар

@BenElgar, просто комментируя строку, в которой упоминались работы, я просто спрашиваю, есть ли там риск
mwangaben

6

Если вы используете это с php file.php. Вам необходимо отредактировать php.ini Найти этот файл:

: locate php.ini
/etc/php/php.ini

И добавьте к open_basedirсвойству путь к файлу :

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/:/run/media/andrew/ext4/protected


Это единственное решение, которое указывает на несколько конкретных путей вместо того, чтобы полностью пропустить безопасность.
mvreijn 03

5

Для меня проблема заключалась в неправильных / отсутствующих значениях конфигурации для сервера Plesk, на котором все это работает. Я просто следовал инструкциям здесь: http://davidseah.com/blog/2007/04/separate-php-error-logs-for-multiple-domains-with-plesk/

Вы можете настроить PHP так, чтобы для каждого определения VirtualHost был отдельный файл журнала ошибок. Хитрость заключается в том, чтобы точно знать, как его настроить, потому что вы не можете напрямую коснуться конфигурации, не сломав Plesk. Каждое доменное имя на вашем (dv) имеет свой собственный каталог в / var / www / vhosts. Типичный каталог имеет следующие каталоги верхнего уровня:

cgi-bin/
conf/
error_docs/
httpdocs/
httpsdocs/
...and so on

Вам нужно создать файл vhost.conf в папке conf / каталога домена со следующими строками:

php_value error_log /path/to/error_log
php_flag display_errors off
php_value error_reporting 6143
php_flag log_errors on

Измените первое значение, чтобы оно соответствовало вашей фактической установке (я использовал /tmp/phperrors.log). После того, как вы закончите редактировать файл vhost.conf, проверьте конфигурацию с консоли:

apachectl configtest
…or if you don’t have apachectl (as Plesk 8.6 doesn’t seem to)…

/etc/init.d/httpd configtest

И, наконец, сообщите Plesk, что вы внесли это изменение.

/usr/local/psa/admin/bin/websrvmng -a

2

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


Он использует абсолютный путь. Это работает для всех пользователей, кроме этого.
Webnet,

2

если у вас есть такая проблема с ispconfig3 и вы получили такую ​​ошибку

Действует ограничение open_basedir. Файл (/ var / www / clients / client7 / web15) находится за пределами разрешенного пути (ей): .........

Чтобы решить эту проблему (в моем случае), просто установите PHP на SuPHP на панели веб-сайта ispconfig3.

Надеюсь, это кому-то поможет :)


2

У меня была эта проблема на одном из моих сайтов WordPress после обновления и / или перемещения :)

Проверьте в таблице базы данных 'wp_options' 'upload_path' и отредактируйте его правильно ...


какое значение вы установили? /[... ]/public_html/wp-content/uploads?
brett

1

Если используется ispconfig3:

Перейдите в раздел Веб-сайт -> Параметры -> PHP open_basedir:

введите описание изображения здесь

  • В этом поле описаны разрешенные пути, и каждый путь разделяется знаком ":"

/ var / www / clients / client2 / web3 / image: / var / www / clients / client2 / web3 / web: / var / www / ... и так далее

  • Итак, здесь необходимо указать путь, к которому вы хотите получить доступ, в моем случае это:

/ var / www / clients / client2 / web3 / image:

  • Проблема возникает потому, что:

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


0

Если вы используете стек PHP IIS и имеете эту ошибку, обычно это быстрое исправление разрешений.

Если вы сами администрируете сервер Windows и имеете доступ, попробуйте СНАЧАЛА:

Перейдите к папке, в которую вам не нравится писать, и щелкните ее правой кнопкой мыши> открыть свойства> безопасность.

Посмотрите, какие пользователи имеют доступ к папке, у каких - только чтение, а у каких - полный. У вас есть группа, которая блокирует запись?

Исправление будет зависеть от вашей настройки IIS. Используете ли вы анонимную аутентификацию с определенным пользователем IUSR или с удостоверением пула приложений?

В любом случае вы собираетесь добавить новое полное разрешение на запись для одного из IUSR, IIS_IUSRS или идентификатора вашего пула приложений - как я уже сказал, это будет варьироваться в зависимости от вашей настройки и того, как вы хотите это сделать, вы можете спуститься в кроличью нору Google на этом (один такой пост - разрешения IIS_IUSRS и IUSR в IIS8 ) Для меня я использую anon с моим идентификатором пула приложений, поэтому я могу уйти MACHINE_NAME\IIS_IUSRSс полным чтением / записью при любой температуре или загрузке папки.

Мне не нужно ничего добавлять к my open_basedir =в php.ini.


0

В дополнение к ответу @yogihosting , если вы используете DirectAdmin , выполните следующие действия:

  1. Перейдите на страницу входа в DirectAdmin. Обычно это порт 2222.
  2. Войдите как администратор. Его имя пользователя adminпо умолчанию.
  3. В «Уровне доступа» на правой панели убедитесь, что вы находитесь на «Уровне администратора». Если нет, замените его.
  4. В разделе «Дополнительные функции» щелкните «Пользовательские конфигурации HTTPD».
  5. Выберите домен, который хотите изменить.
  6. Введите конфигурации, которые вы хотите изменить, в текстовом поле вверху страницы. Вам следует рассмотреть существующий файл конфигурации и изменить значения на его основе. Например, если вы видите, что open_basedirэто установлено внутри <Directory>, возможно, вам следует заключить свое изменение в связанный <Directory>тег:

    <Directory "/path/to/directory">
        php_admin_value open_basedir none
    </Directory>
    
  7. После внесения необходимых изменений нажмите кнопку «Сохранить».

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

Однако есть и другой способ редактирования файла конфигурации:

Внимание : будьте осторожны и выполняйте следующие действия на свой страх и риск, так как вы можете столкнуться с ошибками или это может привести к простою. Рекомендуемый способ - предыдущий, поскольку он предотвращает неправильное изменение файла конфигурации и показывает ошибку.

  1. Войдите на свой сервер как root.
  2. Перейти к /usr/local/directadmin/data/users. Из перечисленных пользователей перейдите к одному, связанному с доменом, который вы хотите изменить.
  3. Вот httpd.confфайл. Сделайте с него бэкап:

    cp httpd.conf httpd.conf.back
    
  4. Теперь отредактируйте файл конфигурации в любом редакторе. Например, отредактируйте существующий open_basedirв none. Не пытайтесь что-либо убирать, иначе у вас могут возникнуть простои. Сохраните файл после редактирования.

  5. Перезапустите веб-сервер Apache одним из следующих способов (используйте sudoпри необходимости):

    httpd -k graceful
    apachectl -k graceful
    apache2 -k graceful
    
  6. Если вы обнаружите какие-либо ошибки, замените основной файл конфигурации файлом резервной копии и перезапустите веб-сервер.

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

Надеюсь, это поможет!


0

Я использую Apache vhost -File для запуска PHP со специфическими для приложения ini-параметрами на моем сервере Windows. Поэтому я использую параметр -d команды php.

Я устанавливаю open_basedir для каждого приложения в качестве одной из этих опций.

Мне нужно было установить несколько URL-адресов как open_basedir, включая UNC-Path , и синтаксис для этого случая было немного сложно найти. Вы должны разделять пути точками с запятой, и если ваш первый путь начинается с буквы диска, вам, возможно, придется начинать список с точки с запятой. По крайней мере, у меня это работает.

Пример:

php.exe -d open_basedir=;d:/www/applicationRoot;//internal.unc.path/ressource/

-3

Просто ищи

open_basedir =

в php.ini и отключите его. Это самое простое решение этой проблемы.

До изменений open_basedir =

После изменений ;open_basedir =

Ps - После изменений не забудьте перезагрузить сервер.

Наслаждаться ;)


3
не делайте этого ... безопасность важна, хотите верьте, хотите нет . :) Время читать документацию по вашим инструментам: php.net/manual/en/ini.core.php#ini.open-basedir
Адам Ленда
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.