move_uploaded_file dà l'errore "Impossibile aprire il flusso: autorizzazione negata"


143

Continuo a ricevere questo errore quando provo a configurare la directory di upload con Apache 2.2 e PHP 5.3 su CentOS.

In php.ini:

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

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

Autorizzazioni per 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

Indipendentemente da ciò che faccio, continuo a ricevere questo errore da PHP quando carico il file:

Avvertenza: move_uploaded_file (images / robot.jpg): impossibile aprire il flusso: autorizzazione negata in /var/www/html/mysite/process.php sulla riga 78

Avvertenza: move_uploaded_file (): impossibile spostare '/ tmp / phpsKD2Qm' in 'images / robot.jpg' in /var/www/html/mysite/process.php sulla riga 78

Come puoi vedere, non ha mai preso la configurazione dal file php.ini per quanto riguarda il file di upload.

Cosa sto facendo di sbagliato qui?


775? Forse il tuo server funziona come nessuno. In questo caso solo root può scrivere (le tue autorizzazioni per "immagini") ...
Konrad Borowski

cosa significa ? come posso cambiarlo?
user63898,

Ricorda che TUTTE le directory principali devono anche avere le autorizzazioni giuste.
Sridhar Sarnobat,

Risposte:


188

Questo perché imagese tmp_file_uploadsono scrivibili solo rootdall'utente. Affinché il caricamento funzioni, dobbiamo rendere il proprietario di quelle cartelle uguale al proprietario del processo httpd o renderle scrivibili a livello globale (cattiva pratica).

  1. Controllare apache titolare del trattamento: $ps aux | grep httpd. La prima colonna sarà in genere il proprietarionobody
  2. Cambia il proprietario di imagese tmp_file_uploaddiventare nobodyo qualunque sia il proprietario che hai trovato nel passaggio 1.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
  3. Chmod imagese tmp_file_uploadora essere scrivibile dal proprietario, se necessario [Sembra che tu lo abbia già installato]. Menzionato nella risposta @Dmitry Teplyakov.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
    
  4. Per maggiori dettagli sul perché questo comportamento accada, consulta il manuale http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir , nota che parla anche di open_basedirdirettiva.


4
Grazie: il nostro vecchio proprietario era un demone ora è apache
zzapper il

Questa correzione si applica alle situazioni in cui è possibile modificare il tipo di server php da fast_CGI, CGI a Apache_mod come plesk ecc. Può continuare con le autorizzazioni dell'utente originale non apache. Ciò ha risolto i miei problemi.
elliotrock,

1
Sto riscontrando lo stesso errore, ma sia il processo che le cartelle sono di proprietà di jacobme (in quanto è il mio computer locale) e tutte le cartelle hanno 755o 775.
limeandcoconut

Ho dovuto riavviare il mio processo di Apache sudo service httpd restartdopo aver modificato le autorizzazioni. Poi ha funzionato :) Invece di cambiare proprietario chownho aggiunto il mio processo apache a un gruppo "www" e ho aggiunto queste directory allo stesso gruppo "www" attraversochgrp
Ali Saeed

76

Puoi anche eseguire questo script per scoprire il proprietario del processo Apache:

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

E poi cambia il proprietario della directory di destinazione in quello che hai. Usa il comando:

chown user destination_dir

E quindi usa il comando

chmod 755 destination_dir

per modificare l'autorizzazione della directory di destinazione.


3
Grazie funziona per me. Ho usato per la prima volta il metodo di Laith Shadeed ma non ottengo lo stesso risultato digitando ps aux | grep httpd e <?php echo exec('whoami'); ?>. Qualcuno sa perché?
Kukinsula,

1
ps aux | grep https non restituisce il nome del proprietario del server web. Questo fa: ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | testa -1 | cut -d \ -f1 Fron Symfony doc.
David Jacquel,

1
Si noti che nel comando sopra, ci dovrebbero essere due spazi tra "-d \" e "-f1". Se copi e incolla così com'è, potresti ricevere un errore come "cut: bad delimitatore".
Beejor,

1
più 1 per exec('whoami'). Mi ha salvato altri 30 minuti. Chowning Ubuntu User
Deval Khandelwal

11
dovrebbe essere www-data? di solito
massimo

18

Se hai Mac OS X, vai alla radice del file o alla cartella del tuo sito web.

Quindi fai clic con il tasto destro su di esso, vai per ottenere informazioni, vai in fondo ( Condivisione e autorizzazioni ), aprilo, cambia tutto di sola lettura per leggere e scrivere. Assicurati di aprire il lucchetto, vai sull'icona di impostazione e scegli Applica agli elementi allegati ...


Perché stai commentando il Mac OS quando la sua domanda riguarda un sistema Linux?
Kmeixner,

7
Ciao Hawkar, grazie per la tua risposta. Sono su Mac e la tua risposta ha risolto il mio problema. Molte grazie.
Sanjay Sharma,

2
Adoro questa risposta
Alexey Sh.

2
@Kmeixner questa domanda su Linux ma ho avuto esattamente lo stesso problema sul mio OSX. Grazie per questo commento ha funzionato per me dopo aver modificato le opzioni di scrittura nella cartella /private/var/tmpsul mio Mac.
Salam,

Questo è un messaggio più vecchio, ma questo è esattamente quello che avevo bisogno di fare. Grazie
TheRobQ

14

Questo ha funzionato per me.

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

Quindi disconnettersi o riavviare.

Se si SELinuxlamenta, provare quanto segue

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

mi ha salvato la vita :) .. uso l'hook post-recive di GIT per distribuire il mio web, e ogni volta che lo distribuisco ottengo il suo errore negato il permesso, aggiungendo l'utente git ai dati www lo
risolvo

Questa è la risposta migliore
saviour123

12

Volevo aggiungere questo ai suggerimenti precedenti. Se stai usando una versione di Linux con SELinux abilitato, dovresti anche eseguirlo in una shell:

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

Oltre a concedere le autorizzazioni utente al server Web tramite il gruppo o la modifica del proprietario della directory.


restorecon -R -v /path/to/your/directoryprobabilmente deve essere incluso anche in questo dopo. access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
AbsoluteƵERØ

potrebbe benissimo essere vero, ma io supponevo che chcon "cambiasse contesto", cioè che fosse appena cambiato. quello che stai guardando usa prima "semanage fcontext" che lo inserisce in alcuni file di impostazioni "file_contexts.local", tuttavia non cambia mai il contesto.
Chris,

@ Chris, grazie amico. Questo ha risolto il mio problema. Per favore, potresti far luce sulla questione? Cosa fa effettivamente questo comando? Ho consultato le pagine man e persino le informazioni per chcon e non ho trovato il valore del tipo inserito. Sono un po 'confuso qui.
Joker

rende la directory o i file leggibili dal web server (httpd) ... sinceramente non voglio e probabilmente non potrei spiegare selinux perché a malapena ho una comprensione in me ... per favore vedi nsa.gov/what-we-do / research / selinux / documentazione e access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
Chris

11

Modifica le autorizzazioni per questa cartella

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


1
fatto ora come: drwxrwxr-x 2 root root 4096 11 novembre 10:01 immagini anche su: drwxrwxr-x 2 root root 4096 12 novembre 04:54 tmp_file_upload ma sempre lo stesso errore
user63898

7

Prova questo:

  1. apri / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. sostituisci www-datacon il tuoyour_username

    "export APACHE_RUN_USER=www-data" 

    sostituirlo con

    export APACHE_RUN_USER='your_username' 

7

Ho riscontrato questo problema correlato anche dopo aver eseguito correttamente il compositore. Ho aggiornato il compositore e durante l'esecuzione composer installo php composer.phar installho ottenuto:

... impossibile aprire il flusso: autorizzazione negata ...

Dopo molte ricerche risulta che le precedenti risposte relative alla modifica delle autorizzazioni per la cartella hanno funzionato. Sono solo directory leggermente diverse ora.

Nella mia installazione, su OS X, il file cache è presente /Users/[USER]/.composer/cachee ho riscontrato problemi perché il file cache era di proprietà di root. La modifica della proprietà di ".composer" in modo ricorsivo al mio utente ha risolto il problema.

Questo è quello che ho fatto:

sudo chown -R [USER] cache

Quindi ho eseguito nuovamente l'installazione del compositore e voilà!


5

Questo problema si verifica quando l'utente apache (www-data) non ha i permessi per scrivere nella cartella. Per risolvere questo problema è necessario inserire l'utente all'interno del gruppo www-data.

Ho appena fatto questo:

Esegui questo codice php <?php echo exec('whoami'); ?>per scoprire l'utente utilizzato da apache. Dopo, esegui i comandi nel terminale:

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

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

Restituirà qualcosa del genere:

total of files

drwxr-xr-x 7 user group size date folder

Ho mantenuto l'utente ma ho cambiato il gruppo in www-data

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername

4

La soluzione è così semplice Fai clic con il pulsante destro del mouse sulla cartella IMMAGINE (destinazione), vai su Proprietà, fai clic sulla scheda delle autorizzazioni e modifica l'accesso di altri a Crea ed elimina file .


Il modo più veloce MA, solo tu stai usando la GUI per FTPing (FileZilla, WinSCP)
CLOUGH

3

Basta cambiare l'autorizzazione di tmp_file_upload su 755 Di seguito è riportato il comando chmod -R 755 tmp_file_upload


2

Prova questo

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


ottenere: chmod: operando mancante dopo `664 '
user63898
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.