PHP mkdir: problème d'autorisation refusée

99

Je suis en train de créer un répertoire avec la fonction PHP mkdir mais je reçois une erreur comme suit: Warning: mkdir() [function.mkdir]: Permission denied in .... Comment régler le problème?

folos
la source
2
Plateforme / serveur Web / système d'exploitation?
Salman A
1
Vérifiez cette question: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir J'avais le même problème et la réponse ici vient de résoudre mon problème. Si vous utilisez Linux, la réponse à propos de SELinux peut s'appliquer à vous.
Lucas Madureira
essayez ceci, ça marche pour moi stackoverflow.com/a/12656964/7516620 entrez la description du lien ici
Akshay Italiya

Réponses:

171

Je sais que c'est un vieux fil, mais il faut une meilleure réponse. Vous ne devriez pas avoir besoin de définir les autorisations sur 777, c'est un problème de sécurité car cela donne un accès en lecture et en écriture au monde. Il se peut que votre utilisateur apache ne dispose pas des autorisations de lecture / écriture sur le répertoire.

Voici ce que vous faites dans Ubuntu

  1. Assurez-vous que tous les fichiers appartiennent au groupe et à l'utilisateur Apache. Dans Ubuntu, c'est le groupe et l'utilisateur www-data

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

  2. Ensuite, tous les membres du groupe www-data ont pu lire et écrire des fichiers

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

La mkdir()fonction php devrait maintenant fonctionner sans renvoyer d'erreurs

moteur simple
la source
3
Bonne réponse! Espérons que cela fera son chemin vers le haut de la page avec le temps!
Très irrégulier
16
C'est une très mauvaise idée .
Big McLarge énorme
Apache a besoin d'une autorisation pour écrire des choses comme le cache et les journaux ... c'est juste une question de réglage fin.
Manatax
@simpleengine Salut, j'ai remarqué votre réponse .. Je suis confronté au même problème avec un projet que j'essaie de créer dans CodeIgnter et de développer dans Ubuntu 14.14 Lts .. Pourriez-vous s'il vous plaît m'expliquer plus en détail les étapes nécessaires pour faire pour corriger cette erreur ??? Pour vous donner quelques informations supplémentaires: le chemin absolu est /opt/lampp/htdocs/www/my-app/public/uploads.. Fondamentalement, ce que j'essaie de faire est que chaque utilisateur connecté télécharge des fichiers dans le dossier uploads et crée également des dossiers d'albums (cela sera fait avec php) pour stocker des photos ..
ltdev
6
Je n'aime pas les utilisateurs qui ne cessent de dire "ce n'est pas sûr" sans montrer la manière sécurisée de le faire.
che-azeh
38

Réponse tardive pour les personnes qui trouveront cela via google à l'avenir. J'ai rencontré le même problème.

REMARQUE: JE SUIS SUR MAC OSX LION

Ce qui se passe, c'est qu'apache est exécuté en tant qu'utilisateur "_www" et n'a pas les autorisations pour modifier les fichiers. Vous remarquerez qu'aucune fonction du système de fichiers ne fonctionne via php.

Comment réparer:

Ouvrez une fenêtre de recherche et dans la barre de menus, choisissez Aller> Aller au dossier> / private / etc / apache2

maintenant ouvrez httpd.conf

trouver:

User _www 
Group _www

changer le nom d'utilisateur:

User <YOUR LOGIN USERNAME>

Maintenant, redémarrez Apache en exécutant ce terminal de formulaire:

sudo apachectl -k restart

Si cela ne fonctionne toujours pas, il se trouve que je fais ce qui suit avant de faire ce qui précède. Cela pourrait être lié.

Ouvrez le terminal et exécutez les commandes suivantes: (notez que les fichiers de mon serveur Web se trouvent dans / Bibliothèque / WebServer / www. Changez en fonction de l'emplacement de votre site Web)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
Chris Ingis
la source
6
Cette solution fonctionne, mais permet à Apache de faire des ravages dans votre système si quelqu'un lui demande d'exécuter du code malveillant (par exemple via l'exploit Shellshock). Une alternative serait de laisser Apache s'exécuter en tant que _wwwet de créer un groupe pour vous et Apache. Créez un nouveau groupe, dites appelé trusted, et inscrivez-vous _www. Faites ensuite confiance au propriétaire du groupe de tous les fichiers du répertoire de documents de votre serveur. Enfin, faites le chmod g+rwxcas échéant sur uniquement les fichiers auxquels Apache a besoin d'accéder, afin que le trustedgroupe soit autorisé à modifier les fichiers.
Chris Middleton
3
juste sonner pour souligner à nouveau que cette réponse est une mauvaise idée. il existe de très bonnes raisons pour lesquelles les processus apache appartiennent à leur propre utilisateur spécialisé.
danyamachine
15

Ne définissez pas les autorisations sur 777 lors de l'utilisation de mkdir en PHP

Les réponses aux liens uniquement ne sont pas considérées comme une bonne pratique sur StackOverflow, mais les conseils donnés ici ne doivent généralement PAS être suivis.

Je voudrais revenir sur cette excellente réponse à une question similaire . Je cite:

Veuillez arrêter de suggérer d'utiliser 777. Vous rendez votre fichier accessible en écriture par tout le monde, ce qui signifie à peu près que vous perdez toute la sécurité pour laquelle le système d'autorisation a été conçu. Si vous suggérez cela, pensez aux conséquences que cela peut avoir sur un serveur web mal configuré: il deviendrait incroyablement facile de "pirater" le site, en écrasant les fichiers. Alors, ne le faites pas.

Se flétrir
la source
9

Fixer les permissions du répertoire que vous essayez de créer un répertoire dans .

Erik
la source
Je viens de résoudre le problème dans la question d'origine en modifiant les autorisations de fichier sur 755 de manière récursive, en utilisant Filezilla. Cliquez avec le bouton droit sur le dossier parent, en supposant qu'il s'agit d'une sorte de dossier de référentiel de fichiers général sur lequel il est possible de définir des autorisations 755, puis Attributs de fichier -> Valeur numérique -> 755, puis cochez "Recurse dans les sous-répertoires". Prend quelques minutes pour se propager dans les sous-répertoires si vous avez beaucoup de fichiers. Puis réessayez.
TARKUS
7

Je sais que ce fil est vieux, mais peut-être que cela aidera quelqu'un, un jour.

Le problème pour lequel PHP dit "Autorisation refusée" pour mkdir () - chemin d'URL incorrect. Donc, pour résoudre ce problème, tout ce dont vous avez besoin est d'obtenir le chemin correct. Je l'ai fait de cette façon:

<?php

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

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

?>
Boris
la source
1
Cela m'est arrivé lors du transfert vers un nouvel hôte (qui a mysqlnd lol). J'ai oublié de passer au nouveau chemin complet du répertoire personnel. Il s'avère que ce n'était pas vraiment un problème de permission.
JSG
2

Vous devez disposer de l'autorisation du système de fichiers pour créer le répertoire.

Exemple: dans Ubuntu 10.04, apache (php) s'exécute en tant qu'utilisateur: www-data dans le groupe: www-data

Cela signifie que l'utilisateur www-data a besoin d'un accès pour créer le répertoire.

Vous pouvez l'essayer vous-même en utilisant: 'su www-data' pour devenir l'utilisateur www-data.

En guise de solution rapide, vous pouvez faire: sudo chmod 777 my_parent_dir

Jon Skarpeteig
la source
14
chmod 0777donnera un accès en lecture et en écriture au monde! Vous ne devriez pas conseiller quelque chose comme ça. Cependant, le conseil avec le groupe d'utilisateurs est actuellement le meilleur ici :)
KingCrunch
1
Si le monde a accès au système d'exploitation, bien sûr. La meilleure façon serait: sudo chown www-data: www-data my_parent_dir
Jon Skarpeteig
Ou laissez les autorisations seules et ajoutez www-data au groupe du répertoire parent.
Marc B
0

L'autre chose que vous pouvez faire est d'aller dans: / etc / sudoers

Ajoutez-y la ligne suivante qui donne la permission à cet utilisateur www-data ALL = (ALL: ALL) ALL Pourquoi www-data? c'est parce qu'apache s'exécute sous ce nom d'utilisateur.

Incase si votre utilisateur est différent, essayez le nom d'utilisateur ALL = (ALL: ALL) ALL

Cela a fonctionné pour moi.

Maxwells
la source
5
ne modifiez pas sudoersdirectement, mais connectez-vous en tant que root et utilisez la visudocommande te : qui vérifie les modifications pour éviter les modifications erronées, qui peuvent provoquer des erreurs d'analyse lorsque le fichier sudoers est chargé, ce qui pourrait vous laisser impuissant (car aucun droit à changer quoi que ce soit)
Elias Van Ootegem
Comment trouver le nom d'utilisateur. comme www-data? J'utilise nginx mais je ne travaille pas
robspin
1
@robspin essayez ceci: ps aux | egrep '(nginx)'
maxwells
0

Puisque vous êtes sur un mac, vous pouvez vous ajouter au groupe _www (le groupe d'utilisateurs apache) sur votre mac:

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

et ajoutez l'utilisateur _www au groupe de roues qui semble être ce que le mac crée des fichiers comme:

sudo dseditgroup -o edit -a _www -t user wheel
SeanJA
la source
0

J'ai ce problème tout à l'heure, ma meilleure solution que je puisse vous donner pour le moment (bien que vous n'ayez inclus aucun de votre code) serait:

  1. Vérifiez comment vous nommez votre dossier de destination, par exemple: nouveau_folder (parfois cela peut provoquer une erreur d'autorisation car la plupart des hôtes n'autorisent pas la création de noms utilisant des traits de soulignement, des tirets, etc. au moment de l'exécution). Cela a fonctionné pour moi.
  2. Si vous utilisiez la commande récursive pour créer des sous-dossiers, n'oubliez pas de mettre 0755 (n'oubliez pas d'inclure 0 au début) dans la commande mkdir, par exemple:

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

Cela a également fonctionné pour moi en ce moment.

arungisyadi
la source
3
777 est un problème de sécurité
MaicolBen
Modifié tout à l'heure, à 0755
arungisyadi
0

Si vous utilisez LINUX, vérifions d'abord l'utilisateur d'Apache, car dans certaines distributions, cela peut être différent:

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

Disons que le résultat est "http". Faites ce qui suit, souvenez-vous simplement de changer path_to_folder en chemin de dossiers:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
Marcelo Agimóvel
la source
0

vérifier si ce n'est pas un problème avec 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);
            }
        }
    }
}
ceph3us
la source
0

Après avoir installé le serveur ftp avec sudo apt-get install vsftpdvous devrez le configurer. Pour activer l'accès en écriture, vous devez modifier le /etc/vsftpd.conffichier et décommenter le

#write_enable=YES

ligne, donc il devrait lire

write_enable=YES

Enregistrez le fichier et redémarrez vsftpdavec sudo service vsftpd restart.

Pour d'autres options de configuration, consultez cette documentation ouman vsftpd.conf

mon soleil
la source
0

Cette erreur se produit si vous utilisez le mauvais chemin.

Par exemple:

J'utilise le système ubuntu et le nom de mon dossier de projet est 'myproject'

Supposons que le répertoire myproject / public / report existe et que je souhaite créer un nouveau dossier appelé orders

Ensuite, j'ai besoin d'un chemin complet où mon projet existe. Vous pouvez obtenir le chemin par la commande PWD

Mon chemin racine sera donc = '/ home / htdocs / myproject /'

$ dir = '/ home / htdocs / monprojet / public / rapport / Commandes';

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

Cela fonctionnera pour vous !! Prendre plaisir !!

Umang Soni
la source