move_uploaded_file génère l'erreur "Échec de l'ouverture du flux: Autorisation refusée"

143

Je continue à recevoir cette erreur en essayant de configurer le répertoire de téléchargement avec Apache 2.2 et PHP 5.3 sur CentOS.

Dans php.ini:

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

Dans 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>

Autorisations du répertoire 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

Peu importe ce que je fais, je reçois cette erreur de PHP lorsque je télécharge le fichier:

Avertissement: move_uploaded_file (images / robot.jpg): échec de l'ouverture du flux: autorisation refusée dans /var/www/html/mysite/process.php en ligne 78

Attention: move_uploaded_file (): Impossible de déplacer '/ tmp / phpsKD2Qm' vers 'images / robot.jpg' dans /var/www/html/mysite/process.php en ligne 78

Comme vous pouvez le voir, il n'a jamais pris la configuration du fichier php.ini concernant le fichier de téléchargement.

Qu'est-ce que je fais de mal ici?

user63898
la source
775? Peut-être que votre serveur fonctionne comme personne. Seul root peut écrire dans ce cas (vos permissions "images") ...
Konrad Borowski
Qu'est-ce que ça veut dire ? Comment puis-je le changer ?
user63898
N'oubliez pas que TOUS les répertoires parents doivent également disposer des autorisations appropriées.
Sridhar Sarnobat

Réponses:

188

C'est parce que imageset tmp_file_uploadne sont accessibles en écriture que par l' rootutilisateur. Pour que le téléchargement fonctionne, nous devons rendre le propriétaire de ces dossiers identique au propriétaire du processus httpd OU les rendre globalement accessibles en écriture (mauvaise pratique).

  1. Vérifiez apache propriétaire du processus: $ps aux | grep httpd. La première colonne sera le propriétaire généralement ce seranobody
  2. Changez le propriétaire de imageset tmp_file_uploaddevenir nobodyou quel que soit le propriétaire que vous avez trouvé à l'étape 1.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. Chmod imageset tmp_file_uploadmaintenant accessible en écriture par le propriétaire, si nécessaire [Il semble que vous l'ayez déjà en place]. Mentionné dans la réponse @Dmitry Teplyakov.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. Pour plus de détails sur les raisons de ce comportement, consultez le manuel http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir , notez qu'il parle également de open_basedirdirective.

Laith Shadeed
la source
4
Merci: notre ancien propriétaire avait été démon, il est maintenant apache
zzapper
Ce correctif s'applique aux situations où vous pourriez changer le type de serveur php de fast_CGI, CGI à Apache_mod car plesk etc. peut continuer avec les permissions de l'utilisateur d'origine et non apache. Cela a résolu mes problèmes.
elliotrock
1
J'ai la même erreur, mais le processus et les dossiers appartiennent à jacob(moi, car c'est ma machine locale) et les dossiers ont tous 755ou 775.
limeandcoconut
J'ai dû redémarrer mon processus apache sudo service httpd restartaprès avoir changé les autorisations. Ensuite, cela a fonctionné :) Au lieu de changer de propriétaire, chownj'ai ajouté mon processus apache à un groupe 'www' et j'ai ajouté ces répertoires au même groupe 'www' viachgrp
Ali Saeed
76

Vous pouvez également exécuter ce script pour connaître le propriétaire du processus Apache:

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

Et puis changez le propriétaire du répertoire de destination en ce que vous avez. Utilisez la commande:

chown user destination_dir

Et puis utilisez la commande

chmod 755 destination_dir

pour modifier l'autorisation du répertoire de destination.

twlkyao
la source
3
Merci ça marche pour moi. J'ai d'abord utilisé la méthode de Laith Shadeed mais je n'obtiens pas le même résultat en tapant ps aux | grep httpd et <?php echo exec('whoami'); ?>. Quelqu'un sait-il pourquoi ?
kukinsula
1
ps aux | grep https ne renvoie pas le nom du propriétaire du serveur Web. Cela fait: ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-données | [n] ginx' | grep -v racine | tête -1 | couper -d \ -f1 Fron Symfony doc.
David Jacquel
1
Notez que dans la commande ci-dessus, il doit y avoir deux espaces entre "-d \" et "-f1". Si vous copiez-collez tel quel, vous pouvez obtenir une erreur du type "couper: mauvais délimiteur".
Beejor
1
plus 1 pour exec('whoami'). M'a sauvé 30 minutes de plus. était chowning utilisateur ubuntu
Deval Khandelwal
11
cela devrait-il être www-data? habituellement
maxisme
18

Si vous utilisez Mac OS X, accédez à la racine du fichier ou au dossier de votre site Web.

Ensuite, faites un clic droit dessus, allez pour obtenir des informations, allez tout en bas ( Partage et autorisations ), ouvrez cela, changez tout en lecture seule pour lire et écrire. Assurez-vous d'ouvrir le cadenas, accédez à l'icône de réglage et choisissez Appliquer aux éléments inclus ...

étudiant en informatique hawkar
la source
Pourquoi commentez-vous le Mac OS alors que sa question concerne un système Linux?
Kmeixner
7
Salut Hawkar, merci pour votre réponse. Je suis sur mac et votre réponse a résolu mon problème. Merci beaucoup.
Sanjay Sharma
2
J'adore cette réponse
Alexey Sh.
2
@Kmeixner cette question sur Linux mais j'ai eu exactement le même problème sur mon OSX. Merci pour ce commentaire, cela a fonctionné pour moi après avoir changé les options d'écriture dans le dossier /private/var/tmpsur mon Mac.
Salam
C'est un article plus ancien, mais c'est exactement ce que je devais faire. THanks
TheRobQ
15

Cela a fonctionné pour moi.

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

Puis déconnectez-vous ou redémarrez.

En cas de SELinuxplainte, essayez ce qui suit

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'
Junius L.
la source
m'a sauvé la vie :) .. J'utilise le hook post-recive GIT pour déployer mon site Web, et chaque fois que je déploie, je reçois une erreur d'autorisation refusée, l'ajout d'un utilisateur git à www-data a résolu le
problème
C'est la meilleure réponse.
saviour123
13

Je voulais ajouter ceci aux suggestions précédentes. Si vous utilisez une version de Linux sur laquelle SELinux est activé, vous devez également l'exécuter dans un shell:

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

En plus de donner à votre serveur Web des autorisations utilisateur via un groupe ou en changeant le propriétaire de l'annuaire.

Chris
la source
restorecon -R -v /path/to/your/directorydoit probablement également être inclus dans cela par la suite. access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
AbsoluteƵERØ
peut très bien être vrai, mais j'étais sous l'hypothèse que chcon "a changé de contexte" c'est-à-dire qu'il a juste été changé. ce que vous regardez utilise d'abord "semanage fcontext" qui le place dans un fichier de paramètres "file_contexts.local", mais cela ne change jamais le contexte.
Chris
@Chris, merci mec. Cela a résolu mon problème. Voudriez-vous s'il vous plaît éclaircir la question? Que fait réellement cette commande? J'ai parcouru les pages de manuel et même les informations de chcon et je n'ai pas trouvé la valeur du type que vous avez entré. Je suis un peu confus ici.
joker
cela rend le répertoire ou les fichiers lisibles par le serveur Web (httpd) ... Honnêtement, je ne veux pas et je ne pourrais probablement pas expliquer selinux car je comprends à peine moi-même ... s'il vous plaît voir nsa.gov/what-we-do / research / selinux / documentation et access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
Chris
11

Modifier les autorisations pour ce dossier

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

Dmitry Teplyakov
la source
1
l'a fait maintenant, c'est comme: drwxrwxr-x 2 root root 4096 11 novembre 10:01 images également sur: drwxrwxr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload mais toujours la même erreur
user63898
7

Essaye ça:

  1. ouvrez / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. remplacer www-datapar votreyour_username

    "export APACHE_RUN_USER=www-data" 

    remplacer par

    export APACHE_RUN_USER='your_username' 
redrider
la source
7

J'ai rencontré ce problème lié même après avoir déjà exécuté avec succès composer. J'ai mis à jour le compositeur, et lors de l'exécution composer installou php composer.phar installj'ai obtenu:

... échec de l'ouverture du flux: autorisation refusée ...

Il s'avère qu'après de nombreuses recherches, les réponses précédentes concernant la modification des autorisations pour le dossier ont fonctionné. Ce ne sont plus que des répertoires légèrement différents maintenant.

Dans mon installation, sur OS X, le fichier de cache est dans /Users/[USER]/.composer/cache, et j'ai eu des problèmes car le fichier de cache appartenait à root. Changer la propriété de «.composer» de manière récursive pour mon utilisateur a résolu le problème.

C'est ce que j'ai fait:

sudo chown -R [USER] cache

Ensuite, j'ai exécuté à nouveau l'installation du compositeur et le tour est joué!

abaumer
la source
5

Ce problème se produit lorsque l'utilisateur apache (www-data) n'a pas l'autorisation d'écrire dans le dossier. Pour résoudre ce problème, vous devez placer l'utilisateur dans le groupe www-data.

Je viens de faire ceci:

Exécutez ce code php <?php echo exec('whoami'); ?>pour découvrir l'utilisateur utilisé par apache. Après, exécutez les commandes dans le terminal:

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

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

Il renverra quelque chose comme ceci:

total of files

drwxr-xr-x 7 user group size date folder

J'ai gardé l'utilisateur mais j'ai changé le groupe en www-data

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername
Jefferson Romano
la source
4

La solution est si simple. Cliquez avec le bouton droit sur le dossier IMAGE (destination), accédez aux propriétés, cliquez sur l'onglet d'autorisation et modifiez l'accès des autres à Créer et supprimer des fichiers .

Basim
la source
Le moyen le plus rapide MAIS, vous seul utilisez l'interface graphique pour FTP (FileZilla, WinSCP)
CLOUGH
3

Changez simplement la permission de tmp_file_upload en 755 Voici la commande chmod -R 755 tmp_file_upload

Sarang
la source
2

Essaye ça

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664

Simone
la source
obtention: chmod: opérande manquant après `664 '
user63898