move_uploaded_file дає помилку "не вдалося відкрити потік: дозвіл відхилено"


143

Я постійно отримую цю помилку при спробі налаштувати каталог завантаження за допомогою Apache 2.2 та PHP 5.3 на CentOS.

У php.ini:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

У httpd.conf:

Directory /var/www/html/mysite/tmp_file_upload/>
    Options  -Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
                Options -Indexes
</Directory>

Дозволи довідників CentOS:

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

Незалежно від того, що я роблю, я продовжую отримувати цю помилку з PHP, коли завантажую файл:

Попередження: move_uploaded_file (images / robot.jpg): не вдалося відкрити потік: у /var/www/html/mysite/process.php по лінії 78 відмовлено в дозволі

Попередження: move_uploaded_file (): неможливо перемістити '/ tmp / phpsKD2Qm' до 'images / robot.jpg' у /var/www/html/mysite/process.php у рядку 78

Як бачите, він ніколи не брав конфігурацію з файлу php.ini щодо файлу завантаження.

Що я тут роблю неправильно?


775? Можливо, ваш сервер працює як ніхто. У цьому випадку може писати лише корінь (ваші дозволи на "зображення") ...
Конрад Боровський

що це означає ? як я можу це змінити?
user63898

Пам'ятайте, що ВСІ батьківські каталоги також повинні мати правильні дозволи.
Шрідхар Сарнобат

Відповіді:


188

Це відбувається тому , що imagesі tmp_file_uploadбудуть доступні для запису тільки rootкористувачем. Для завантаження на роботу нам потрібно зробити власника цих папок таким же, як власник процесу httpd АБО зробити їх глобально доступними для запису (погана практика).

  1. Перевірте апачскій власник процесу: $ps aux | grep httpd. Перший стовпець буде власником, як правило, він будеnobody
  2. Змініть власника imagesта tmp_file_uploadперетворіться на нього nobodyабо будь-якого власника, якого ви знайшли на кроці 1.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. Chmod imagesі tmp_file_uploadтепер, якщо потрібно, буде записаний власником [Здається, у вас це вже є]. Згадується у відповіді @Dmitry Teplyakov.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. Більш детально, чому така поведінка відбувається, перегляньте посібник http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir , зауважте, що мова йде також про open_basedirдирективу.


4
Дякую: наш старий власник був демоном, це зараз apache
zzapper

Це виправлення застосовується до ситуацій, коли ви могли змінити тип php серверів з fast_CGI, CGI на Apache_mod як plesk тощо., Можна продовжувати з оригінальними дозволами користувача не apache. Це вирішило мої проблеми.
elliotrock

1
У мене є ця сама помилка, але як процес, так і папки належать jacob(мені, як це моя локальна машина), а всі папки мають 755або 775.
limeandcoconut

Мені довелося перезапустити процес apache sudo service httpd restartпісля зміни дозволів. Тоді це спрацювало :) Замість зміни власника chownя додав процес apache до групи "www" і додав ці каталоги до тієї ж "www" групи черезchgrp
Ali Saeed

76

Ви також можете запустити цей сценарій, щоб дізнатися власника процесу Apache:

<?php echo exec('whoami'); ?>

А потім змініть власника каталогу призначення на те, що у вас є. Використовуйте команду:

chown user destination_dir

А потім скористайтеся командою

chmod 755 destination_dir

щоб змінити дозвіл каталогу призначення.


3
Дякую, це працює на мене. Я вперше застосував метод Лаїта Шейда, але я не отримую однакового результату під час введення ps aux | grep httpd і <?php echo exec('whoami'); ?>. Хтось знає, чому?
кукінсула

1
ps aux | grep https не повертає ім'я власника веб-сервера. Це робить: ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v корінь | голова -1 | вирізати -d \ -f1 Fron Symfony док.
Девід Жакел

1
Зауважте, що у наведеній вище команді повинно бути два проміжки між "-d \" та "-f1". Якщо ви скопіюєте вставку як є, ви можете отримати помилку типу "cut: bad lolimer".
Beejor

1
плюс 1 за exec('whoami'). Врятувало мене ще 30 хвилин. був задушеним користувач ubuntu
Deval Khandelwal

11
це має бути www-data? зазвичай
maxisme

18

Якщо у вас Mac OS X, перейдіть до кореня файлів або до папки вашого веб-сайту.

Потім клацніть правою клавішею миші, перейдіть за інформацією, перейдіть до самого низу ( Обмін та дозволи ), відкрийте це, змініть все для читання і запису лише для читання Не забудьте відкрити замок, перейдіть до піктограми налаштування та оберіть Застосувати до доданих елементів ...


Чому ви коментуєте Mac OS, коли його питання стосується системи Linux?
Кмейкснер

7
Привіт Хокар, дякую за вашу відповідь. Я на mac, і ваша відповідь вирішила мою проблему. Дуже дякую.
Санджай Шарма

2
Люблю цю відповідь
Олексій Ш.

2
@Kmeixner це питання про Linux, але у мене було саме таке питання на моєму OSX. Дякую за цей коментар, він працював на мене після того, як я змінив параметри написання у папці /private/var/tmpна своєму Mac.
Салам

Це старша посада, але саме це мені потрібно було зробити. ЗАВДЯКИ
TheRobQ

14

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

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

Потім вийдіть або перезавантажте.

Якщо є SELinuxскарги, спробуйте наступне

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'

врятувало моє життя :) .. Я використовую гак GIT, що відповідає після отримання, для розгортання моєї мережі, і кожного разу, коли я розгортаю, я отримую його дозвіл відхилено помилку, додаючи користувача git до www-data виправлено це :) дякую
Zalaboza

Це найкраща відповідь.
saviour123

13

Я хотів додати це до попередніх пропозицій. Якщо ви використовуєте версію Linux з увімкненою SELinux, вам слід також виконати це в оболонці:

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory

Поряд із наданням дозволу користувачеві вашого веб-сервера через групу чи зміну власника каталогу.


restorecon -R -v /path/to/your/directoryймовірно, потрібно також згодом долучитись до цього. access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
AbsoluteƵERØ

Це може бути правдою, але я був припущений, що chcon "змінив контекст", тобто він просто змінився. те, що ви дивитесь, спочатку використовує "semanage fcontext", який вводить його у файл налаштувань "file_contexts.local", однак це ніколи не змінює контекст.
Кріс

@Chris, Спасибі людина. Це вирішило мою проблему. Чи хотіли б ви пролити трохи світла? Що насправді робить ця команда? Я переглянув сторінки man і навіть інформацію про chcon і не знайшов значення типу, який ви ввели. Я тут трохи розгублений.
жартівник

це робить каталог чи файли читати веб-сервером (httpd) ... я, чесно кажучи, не хочу і, ймовірно, не можу пояснити selinux, оскільки я ледве розумію в ньому сам ... будь ласка, дивіться nsa.gov/what-we-do / дослідження / selinux / документація та access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
Кріс

11

Змінення дозволів для цієї папки

# chmod -R 0755 /var/www/html/mysite/images/


1
зробив це так, як: drwxrwxr-x 2 root root 4096 11 листопада 10:01 зображення також на: drwxrwxr-x 2 root root 4096 12 листопада 04:54 tmp_file_upload, але все-таки така ж помилка
user63898

7

Спробуйте це:

  1. відкрити / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. замінити www-dataсвоїмyour_username

    "export APACHE_RUN_USER=www-data" 

    замінити

    export APACHE_RUN_USER='your_username' 

7

Я зіткнувся з цим пов'язаним питанням навіть після того, як уже успішно працював із композитором. Я оновив композитора, а під час запуску composer installабоphp composer.phar install отримав:

... не вдалося відкрити потік: у дозволі відмовлено ...

Після багатьох досліджень виявляється, що попередні відповіді щодо зміни дозволів для папки працювали. Зараз вони просто трохи різні каталоги.

У моїй установці на OS X знаходиться файл кешу /Users/[USER]/.composer/cache, і у мене виникли проблеми, оскільки кеш-файл належав root. Зміна власності на ".composer" рекурсивно для мого користувача вирішила проблему.

Ось що я зробив:

sudo chown -R [USER] cache

Потім я побіг інсталятор композитора знову і вуаля!


5

Ця проблема виникає, коли користувач apache (www-data) не має дозволу на запис у папку. Щоб вирішити цю проблему, потрібно помістити користувача в групу www-data.

Я щойно зробив це:

Виконайте цей php-код, <?php echo exec('whoami'); ?>щоб виявити користувача, який використовує apache. Після цього виконайте команди в терміналі:

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

Він поверне щось подібне:

total of files

drwxr-xr-x 7 user group size date folder

Я тримав користувача, але змінив групу на www-data

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername

4

Рішення таке просте. Клацніть правою кнопкою миші папку IMAGE (призначення), перейдіть до властивостей, перейдіть на вкладку дозволу та змініть доступ інших користувачів до створення та видалення файлів .


Найшвидший спосіб, але ви використовуєте GUI для FTPing (FileZilla, WinSCP)
CLOUGH

3

Просто змініть дозвіл tmp_file_upload на 755 Далі йде команда chmod -R 755 tmp_file_upload


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