діюче обмеження 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.
Альваро Гонсалес,

19
ВИ НЕ ВСТАВЛЯЄТЕ ЦЕ У СВІЙ ДОСТУП! АЛЕ РЕЧЕ У ВАШОМ КОНФІГУЛЮВАНОМ ФАЙЛІ.
tfont

8
Включення кореневого каталогу до open_basedir повністю перешкоджає призначенню open_basedir. Це рішення "працює" лише в тому сенсі, що по суті відключає обмеження.
Мартін,

114

Змініть налаштування open_basedir у своєму обліковому записі хостингу та встановіть для них значення немає. Знайдіть параметр open_basedir, вказаний у розділі "Налаштування PHP" на вашому Plesk / cPanel. Встановіть для цього значення "none" із випадаючого меню. Я показав їх на малюнку панелі Plesk.

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


1
@yogihosting після цього я отримав помилку - Не вдалося знайти вказану вами модель: Home_model
Heemanshu Bhalla

1
Пізно до цього, але чи є спосіб зробити це для всіх сайтів Plesk? У мене встановлено значення none в глобальному php.ini для версії, яку використовують сайти: gyazo.com/dfffbe7f9b3a20ede97da72f1ddfc777 Але вони все одно отримують помилку.
Matt Cowley

@MattCowley, ти повинен робити це для кожного сайту, розміщеного на панелі plesk.
йогістінг

1
Дуже корисна відповідь, моя проблема вирішена Thumbs up :)
muhammadanish

1
Дякую за це рішення! Це ідеально підходить для мене на спільному хостингу!
Smilefounder

38

Щоб усунути цю помилку, потрібно відредагувати файл httpd.conf. До того, як це можна побачити у phpinfo у розділі apache2handler, директива Server Root. Наприклад, у моєму випадку таким чином - / etc / httpd / httpd.conf. Відкрийте файл httpd.conf, знайдіть згадку про параметр open_basedir. І встановіть для нього значення none. ( php_admin_value open_basedir немає )


Мені вдалося встановити значення "none" - використовуючи інтерфейс Plesk.
diggersworld

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

2
Також знайшов його в моєму php.ini (також Arch). Просто прокоментуйте рядок, щоб досягти того ж ефекту, що і ця відповідь.
Ben Elgar

@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

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 у конф / папці каталогу домену з такими рядками:

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

І нарешті скажіть Плеску, що ви зробили цю зміну.

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

2

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


Він використовує абсолютний шлях. Це працює для всіх користувачів, крім цього.
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 ). Для мене я використовую анонім з моєю ідентифікацією пулу додатків, щоб я міг уникнути MACHINE_NAME\IIS_IUSRSповного читання / запису на будь-якій температурі або завантаження папки.

Мені не потрібно додавати нічого зайвого до мого open_basedir =в php.ini.


0

На додаток до відповіді @ yogihosting , якщо ви використовуєте DirectAdmin , виконайте такі дії:

  1. Перейдіть на сторінку входу DirectAdmin. Зазвичай його порт - 2222.
  2. Увійдіть як адміністратор. Його ім’я користувача adminза замовчуванням.
  3. У розділі "Рівень доступу" на правій панелі переконайтеся, що ви перебуваєте на рівні "Адміністратор". Якщо ні, змініть його.
  4. У розділі "Додаткові функції" натисніть "Спеціальні конфігурації HTTPD".
  5. Виберіть домен, який ви хочете змінити.
  6. Введіть конфігурації, які ви хочете змінити, у текстовому полі вгорі сторінки. Вам слід розглянути існуючий файл конфігурації та змінити значення на його основі. Наприклад, якщо ви бачите, що open_basedirвстановлено всередині a <Directory>, можливо, вам слід оточити зміни у відповідному <Directory>тегу:

    <Directory "/path/to/directory">
        php_admin_value open_basedir none
    </Directory>
    
  7. Після внесення необхідних змін натисніть кнопку "Зберегти".

  8. Тепер ви повинні бачити, як ваші зміни зберігаються у файлі конфігурації, якщо вони були дійсними.

Однак існує інший спосіб редагування файлу конфігурації:

Застереження : Будьте обережні та виконуйте наступні дії на свій страх і ризик, оскільки у вас можуть виникнути помилки або це може призвести до простою. Рекомендований спосіб - попередній, оскільки він запобігає неправильній зміні файлу конфігурації та показує помилку.

  1. Увійдіть на свій сервер як адміністратор.
  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.