PHP mkdir: Проблема в дозволі відмовлена


99

Я намагаюся створити каталог з функцією MKDIR PHP , але я отримую помилку наступним чином : Warning: mkdir() [function.mkdir]: Permission denied in .... Як вирішити проблему?


2
Платформа / веб-сервер / операційна система?
Salman A

1
перевірте це питання: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir У мене була та сама проблема, і відповідь тут просто вирішила мою проблему. Якщо у вас запущено Linux, відповідь про SELinux може стосуватися вас.
Лукас Мадурейра

Відповіді:


171

Я знаю, що це стара тема, але на неї потрібна краща відповідь. Вам не потрібно встановлювати дозволи на 777, це проблема безпеки, оскільки вона надає доступ для читання та запису до світу. Можливо, ваш користувач apache не має дозволів на читання / запис у каталозі.

Ось що ви робите в Ubuntu

  1. Переконайтесь, що всі файли належать групі та користувачеві Apache. В Ubuntu це www- група даних та користувач

    chown -R www-data:www-data /path/to/webserver/www

  2. Далі дозволило всім членам групи даних www читати та писати файли

    chmod -R g+rw /path/to/webserver/www

Тепер mkdir()функція php повинна працювати без повернення помилок


3
Хороша відповідь! Сподіваємось, з часом це прокладе шлях до верхньої частини сторінки!
Сильно нерегулярний


Apache дійсно потребує дозволу на написання таких речей, як кеш і журнали ... це лише питання тонкої настройки.
Manatax

@simpleengine Привіт, я помітив твою відповідь .. Я стикаюся з тією ж проблемою з проектом, який намагаюся створити в CodeIgnter та розробляти в Ubuntu 14.14 Lts .. Не могли б ви пояснити мені більш детально кроки, які мені потрібні? зробити для того, щоб виправити цю помилку ??? Щоб надати вам додаткову інформацію: абсолютний шлях - це /opt/lampp/htdocs/www/my-app/public/uploads.. В основному те, що я намагаюся зробити, - це кожен зареєстрований користувач, щоб завантажити файли всередину папки завантажень, а також створити папки альбомів (це буде зроблено за допомогою php) для зберігання фотографій ..
ltdev

5
Мені не подобаються користувачі, які постійно повторюють "це небезпечно", не показуючи безпечного способу цього.
че-азе

38

Пізня відповідь для людей, які знайдуть це через Google у майбутньому. Я зіткнувся з тією ж проблемою.

ПРИМІТКА: Я НА MAC OSX LION

Що відбувається, це те, що Apache запускається як користувач "_www" і не має дозволів на редагування будь-яких файлів. Ви помітите, що жодна функція файлової системи не працює через php.

Як виправити:

Відкрийте вікно пошуку і на панелі меню виберіть Перейти> Перейти до папки> / private / etc / apache2

тепер відкрийте httpd.conf

знайти:

User _www 
Group _www

змінити ім'я користувача:

User <YOUR LOGIN USERNAME>

Тепер перезапустіть apache, запустивши цей термінал форми:

sudo apachectl -k restart

Якщо це все одно не працює, я роблю наступне, перш ніж зробити вищезазначене. Може бути пов’язане.

Відкрийте термінал і запустіть такі команди: (зауважте, мої файли веб-сервера знаходяться за адресою / Library / WebServer / www. Змінюйте відповідно до розташування вашого веб-сайту)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*

6
Це рішення працює, але дозволяє Apache спричинити хаос з вашою системою, якщо хтось змусить його виконати шкідливий код (наприклад, через експлойт Shellshock). Альтернативою було б залишити Apache виконувати як _wwwі створити групу для вас та Apache. Створіть нову групу, скажіть, зателефонували trusted, і поставте себе і _wwwв неї Потім зробіть довіреним власником групи всі файли у каталозі документів сервера. Нарешті, виконайте chmod g+rwxнеобхідні дії лише для файлів, до яких потрібен доступ Apache, щоб trustedгрупа мала дозвіл на редагування файлів.
Chris Middleton

3
просто поспішаючи, щоб знову підкреслити, що ця відповідь - погана ідея. Є багато дуже вагомих причин того, що процеси Apache належать їхнім власним цільовим користувачам.
danyamachine

15

Не встановлюйте дозволи на 777 під час використання mkdir у PHP

Відповіді лише на посилання не вважаються гарною практикою StackOverflow, але поради, наведені тут, зазвичай НЕ слід виконувати.

Я хотів би повернутися до цієї чудової відповіді на подібне питання . Я цитую:

Будь ласка, припиніть пропонувати використовувати 777. Ви робите свій файл доступним для запису всіма, що майже означає, що ви втрачаєте всю безпеку, на яку була розроблена система дозволів. Якщо ви пропонуєте це, подумайте про наслідки, які це може мати для погано налаштованого веб-сервера: "зламати" веб-сайт, перезаписавши файли, стане неймовірно легко. Тож не робіть.


9

Закріпити права доступу до директорії ви намагаєтеся створити каталог в .


Я щойно вирішив проблему в оригінальному питанні, змінивши дозволи на файли на 755 рекурсивно, використовуючи Filezilla. Клацніть правою кнопкою миші на батьківській папці, припускаючи, що це якась загальна папка сховища файлів, для якої нормально встановити 755 дозволів, потім Атрибути файлів -> Числове значення -> 755, а потім встановіть прапорець "Повторний перегляд у підкаталоги". Якщо у вас багато файлів, потрібно кілька хвилин для розповсюдження по підкаталогах. Потім спробуйте ще раз.
ТАРКУС

7

Я знаю, що ця нитка стара, але, можливо, це колись допоможе комусь.

Проблема, чому PHP каже "Дозвіл відмовлено" для mkdir () - неправильний шлях URL-адреси. Отже, щоб це виправити, потрібно лише отримати правильний шлях. Я зробив це так:

<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';

if( !file_exists($dir) ) {
    mkdir($dir, 0755, true);
}

?>

1
Сталося зі мною при передачі на новий хост (який має mysqlnd lol). Я забув перейти на новий повний шлях до домашнього каталогу. Виявляється, це насправді не була проблемою дозволу.
JSG

2

Для створення каталогу потрібно мати дозвіл на файлову систему.

Приклад: В Ubuntu 10.04 apache (php) працює як користувач: www-data у групі: www-data

Це означає, що користувачеві www-дані потрібен доступ для створення каталогу.

Ви можете спробувати це самостійно, використовуючи: 'su www-data', щоб стати користувачем www-даних.

Для швидкого виправлення ви можете зробити: sudo chmod 777 my_parent_dir


14
chmod 0777дасть доступ до читання та письма до світу! Не слід радити щось подібне. Однак
порада

1
Якщо світ має доступ до ОС, звичайно. Кращим способом буде: sudo chown www-data: www-data my_parent_dir
Jon Skarpeteig

Або залиште дозволи в спокої і додайте www-дані до групи батьківського каталогу.
Marc B

0

Інше, що ви можете зробити, це перейти до: / etc / sudoers

Додайте наступний рядок, який дає дозвіл цьому користувачеві www-data ALL = (ALL: ALL) ALL Чому www-data? це тому, що apache працює під цим іменем користувача.

Якщо ваш користувач інший, спробуйте ім’я користувача ALL = (ALL: ALL) ALL

Це працювало для мене.


5
не редагуйте sudoersбезпосередньо, а увійдіть як root, і використовуйте visudoкоманду te : що перевіряє будь-які зміни, щоб уникнути несправних редагувань, що може спричинити помилки синтаксичного аналізу при завантаженні файлу sudoers, що може залишити вас безсилим (як і відсутність прав на що-небудь змінити)
Еліас Ван Отегем

Як знайти ім'я користувача. як www-дані? Я використовую nginx, але не працюю
robspin

1
@robspin спробуйте це: ps aux | egrep '(nginx)'
maxwells

0

Оскільки ви перебуваєте на mac, ви можете додати себе до групи _www (група користувачів apache) на вашому mac:

sudo dseditgroup -o edit -a $USER -t user _www

і додати користувача _www до групи коліс, що, мабуть, створює файли mac як:

sudo dseditgroup -o edit -a _www -t user wheel

0

У мене ця проблема зараз, найкращим рішенням, яке я можу дати вам зараз (незважаючи на те, що ви не включили жодного свого коду), було б:

  1. Перевірте, як ви називаєте цільову папку, наприклад: new_folder (іноді це може спричинити помилку для дозволу, оскільки більшість хостів не дозволяють створювати імена, що використовують підкреслення, тире тощо) під час виконання). У мене це спрацювало.
  2. Якщо ви використовували рекурсивну команду для створення підпапок, не забудьте поставити 0755 (не забудьте включити 0 на початку) до команди mkdir, наприклад:

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }

Це також зараз у мене працює.


3
777 - це проблема безпеки
MaicolBen

Відредаговано зараз, до 0755
arungisyadi,

0

Якщо ви використовуєте LINUX, спочатку давайте перевіримо користувача apache, оскільки в деяких дистрибутивах він може бути різним:

egrep -i '^user|^group' /etc/httpd/conf/httpd.conf 

Скажімо, результат - "http". Зробіть наступне, просто пам’ятайте, як змінити path_to_folder на шлях до папок:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder

0

перевірте, чи це не проблема з umask

if (!function_exists('mkdir_r')) {
    /**
     * create directory recursively
     * @param $dirName
     * @param int $rights
     * @param string $dir_separator
     * @return bool
     */
    function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
        $dirs = explode($dir_separator, $dirName);
        $dir = '';
        $created = false;
        foreach ($dirs as $part) {
            $dir .= $part . $dir_separator;
            if (!is_dir($dir) && strlen($dir) > 0) {
                $created = mkdir($dir, $rights);
            }
        }
        return $created;
    }
}

if (!function_exists('ensure_dir')) {
    /**
     * ensure directory exist if not create 
     * @param $dir_path
     * @param int $mode
     * @param bool $use_mask
     * @param int $mask
     * @return bool
     */
    function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
        // set mask 
        $old_mask = $use_mask && $mask != null
            ? umask($mask)
            : null;
        try {
            return is_dir($dir_path) || mkdir_r($dir_path, $mode);
        } finally {
            if ($use_mask && $old_mask != null) {
                // restore original
                umask($old_mask);
            }
        }
    }
}

0

Після встановлення сервера ftp sudo apt-get install vsftpdвам доведеться його налаштувати. Щоб увімкнути доступ до запису, вам потрібно відредагувати /etc/vsftpd.confфайл і розкоментувати файл

#write_enable=YES

рядок, тому його слід читати

write_enable=YES

Збережіть файл і перезапустіть за vsftpdдопомогою sudo service vsftpd restart.

Інші варіанти конфігурації див. У цій документації абоman vsftpd.conf


0

Ця помилка виникає, якщо ви використовуєте неправильний шлях.

Наприклад, наприклад:

Я використовую систему ubuntu, і моє ім'я папки проекту - "myproject"

Припустимо , у мене є MyProject / відкритий / звіт каталогу існують і хочете створити нову папку з ім'ям замовлення

Тоді мені потрібен цілий шлях, де існує мій проект. Ви можете отримати шлях за допомогою команди PWD

Отже, моїм кореневим шляхом буде = '/ home / htdocs / myproject /'

$ dir = '/ home / htdocs / myproject / public / report / Orders';

if (!is_dir($dir)) {
   mkdir($dir, 0775, true);
}

Це буде працювати у вас !! Насолоджуйтесь !!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.