file_put_contents (meta / services.json): impossibile aprire il flusso: autorizzazione negata


169

Sono nuovo di Laravel. Stavo cercando di aprire http://localhost/test/public/e ho ottenuto

Errore nel gestore eccezioni.

Ho cercato su google e modificato l'autorizzazione della directory di archiviazione utilizzando chmod -R 777 app/storagema senza risultati.

Ho cambiato debug=>truein app.phpe visitato la pagina e ottenuto l'errore nel gestore di eccezioni:

Impossibile aprire lo stream o il file "/var/www/html/test/app/storage/logs/laravel.log": impossibile aprire lo stream: autorizzazione negata in / var / www / html / test / bootstrap / compilata. php: 8423

Quindi ho modificato le autorizzazioni della directory di archiviazione utilizzando il comando chmod -R 644 app/storagee l'errore "Errore nel gestore eccezioni" è sparito e viene caricata una pagina. Ma qui sto ricevendo questo:

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json): impossibile aprire il flusso: autorizzazione negata


2
sembra di nuovo il problema delle autorizzazioni, chmod ricorsivamente tutte le directory delle applicazioni
anche

@alou Penso di averlo già fatto con chmod -R 777 app / storage. No? E tutte le directory all'interno dell'app hanno l'autorizzazione drwxrwxrwx.
vishnub1626,

33
Prova: php artisan cache:clearpoi chmod -R 777 app/storagefinalmentephp artisan dump-autoload
vsmoraes

@vsmoraes Ha funzionato. Sarà davvero utile se puoi spiegare quale fosse il problema.
vishnub1626

7
Il commento di vsmoraes era corretto, tuttavia invece di "php artisan dump-autoload" dovrebbe essere "compositore dump-autoload"
Elliot Robert,

Risposte:


320

Il suggerimento di vsmoraes ha funzionato per me:

Laravel> = 5.4

php artisan cache:clear 
chmod -R 777 storage/
composer dump-autoload

Laravel <5.4

php artisan cache:clear 
chmod -R 777 app/storage 
composer dump-autoload

NOTA: NON FARLO SU QUALSIASI SERVER REMOTO (DEV O PRODUZIONE)

Quando ho posto questa domanda, questo era un problema sul mio localhost, in esecuzione in una macchina virtuale. Quindi ho pensato che installare un 777 fosse abbastanza sicuro, tuttavia, la gente ha ragione quando dicono che dovresti cercare una soluzione diversa. Prova prima 775


8
Questo dovrebbe essere sudo chmod -R 777 app / storage. per evitare errori di autorizzazione.
Olaitan Mayowa,

5
Per # Laravel5 le istruzioni sono quasi identiche:, php artisan cache:clearquindi chmod -R 777 storage, e poi composer dump-autoload
WNRosenberg

6
Se stai usando Laravel 5.1+ dovrai chmod -R 777 storageinvece farlo
James,

10
php artisan cache:clearè la risposta corretta. Quindi sudo chmod -R ug+rw storagefornisce le autorizzazioni corrette per me, senza dare i othersprivilegi di lettura / scrittura o soprattutto di esecuzione.
Zack Morris,

43
Questa risposta e questa discussione sono ciò che mette in evidenza il motivo per cui non mi piace tanto Laravel: insegna agli sviluppatori che puoi fare tutto quello che vuoi, quando vuoi, il più velocemente possibile, senza pensare alle conseguenze (capisco che 777non è specifico di Laravel, ma il processo di pensiero per gli sviluppatori di Laravel è: "fallo funzionare ORA, non mi interessa come", proprio come 777). Come regola generale, mai e poi mai impostare qualcosa 777per far funzionare qualcosa. COMPRENDERE il proprio server e utenti / ruoli e impostarli di conseguenza; non hackerarlo. I tuoi clienti si fidano che tu faccia questo bene.
Ken

70

Per i googler che hanno riscontrato questo problema con Laravel 5.

Questo è un problema di autorizzazione causato da utenti diversi che provano a scrivere nello stesso file di registro all'interno della storage/logscartella con autorizzazioni diverse.

Quello che succede è che la tua configurazione laravel probabilmente è impostata per registrare gli errori quotidianamente e quindi il tuo server web (apache / nginx) potrebbe creare questo file in un utente predefinito a seconda del tuo ambiente, può essere qualcosa di simile _wwwsu OSX o www-datasu sistemi * NIX, quindi il problema arriva quando potresti aver eseguito alcuni comandi artigiani e alcuni errori, quindi l'artigiano scriverà questo file ma con un utente diverso perché PHP sul terminale viene eseguito da un utente diverso in realtà il tuo utente di accesso, puoi verificarlo eseguendo questo comando :

php -i | grep USER

Se l'utente che ha effettuato l'accesso ha creato quel file di registro sul server Web, non sarà possibile scrivere errori in esso e viceversa perché laravel scrive i file di registro con 655autorizzazioni per impostazione predefinita che consente solo al proprietario di scrivere in esso.

Per correggere questo temporaneo è necessario assegnare manualmente le autorizzazioni per il gruppo 664a questo file in modo che sia l'utente di accesso che l'utente del server Web possano scrivere su quel file di registro.

Per evitare questo problema in modo permanente, potresti voler impostare le autorizzazioni appropriate quando viene creato un nuovo file all'interno storage/logsdella directory ereditando le autorizzazioni dalla directory che questa risposta https://unix.stackexchange.com/a/115632 può aiutarti ad affrontare quello.


fan-friggen-tastic rispondi qui! sono in esecuzione su Elastic Beanstalk e il mio utente PHP della riga di comando è "ec2-user" ma la mia applicazione funziona come "webapp".
Randy L

1
Una risposta che spiega il problema. cioè una risposta adeguata.
Craicerjack,

Questo mi ha aiutato a capire perché stavo ricevendo un errore di cache dei file in Laravel su Cloudways. Ho dovuto premere il pulsante nel pannello Cloudways per ripristinare le autorizzazioni dei file. Grazie.
Ryan,

44

Non dovresti dare 777 autorizzazioni. È un rischio per la sicurezza. Agli utenti di Ubuntu, in Laravel 5, suggerisco di cambiare ricorsivamente il proprietario per l'archiviazione di directory:

Prova quanto segue:

sudo chown -R www-data:www-data storage

Nei sistemi basati su Ubuntu, www-data è un utente apache.


2
Questo risolto per me, ed è più corretto (penso) delle chmod 777risposte. Grazie ~
GavinR,

Penso che sia la risposta più conveniente per gli utenti Linux. Grazie @GavinR. chmod 777è un incubo completo.
Abdalla Arbab,

Questo ha funzionato per me ed è sicuramente un'opzione migliore di chmod -777
Egnaro

Grazie per un nuovo modo di risolvere il problema! Dobbiamo fare qualcosa prima / dopo il tuo comando per invertire le chmod 777conseguenze?
Aleksandar,

41

Per tutti coloro che usano Laravel 5, Homestead e Mac prova questo:

mkdir storage/framework/views

Questo funziona anche con la creazione di un nuovo server con Laravel Forge con Laravel 5.2.7
winkster

2
Questo è stato per me. Sembra che stia bootstrap/cache/compiled.phpprovando a scrivere in questa directory, ma non esiste e finisce per lanciare un errore di permessi. Grazie.
Matt K

1
In qualche modo questo ha funzionato per me. Sto usando Laravel 5.1 a proposito
Yohanes Gultom,

Questo l'ha fatto per me, grazie. Avevo rimosso tutta la mia directory di archiviazione pensando che questo sarebbe stato generato di nuovo da laravel, suppongo di no.
Grimmdude,

33

alcune volte SELINUX ha causato questo problema; puoi disabilitare selinux con questo comando.

sudo setenforce 0

wow, ho davvero fatto il trucco e funziona, qualcuno può spiegarmi perché ha funzionato? che cos'è selinux?
undefinedman,

sì, ha funzionato davvero! per favore aiutaci guru a capirlo su SELINUX?
sto

1
Grazie mille. Cerco in rete e tutti mi dicono di controllare l'autorizzazione, controllare l'utente e così via ...
Ali ZahediGol

3
Questo è fondamentalmente come disattivare l'intero firewall perché stava bloccando una porta che dovevi aprire.
Te JoE

Non ne avevo mai sentito parlare. "Security-Enhanced Linux (SELinux) è un modulo di sicurezza del kernel Linux che fornisce un meccanismo per supportare le politiche di sicurezza del controllo degli accessi." Dubito che sia una buona idea spegnerlo. E scommetto che i votanti usano ciecamente questo comando senza comprenderne le conseguenze.
Ryan,

18

Problema risolto

php artisan cache:clear
sudo chmod -R 777 vendor storage

questo abilita il permesso di scrittura per app, framework, registri Spero che questo possa aiutare


12
mai 777 ... in sviluppo o prod in quanto darà l'illusione di cose che funzionano in sviluppo ma si romperanno in prod a meno che anche nel 777 che non è mai una buona idea
Kyle Burkett

wooha tu rock ... il venditore era quello che mi mancava
lu1s

sì, dare qualcosa su un web di fronte al pubblico 777 è una cattiva idea
imabug

17

NON DARE MAI PERMESSO 777!

vai alla directory del progetto laravel sul tuo terminale e scrivi:

sudo chown -R your-user:www-data /path/to/your/laravel/project/
sudo find /same/path/ -type f -exec chmod 664 {} \;
sudo find /same/path/ -type d -exec chmod 775 {} \;
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

In questo modo stai rendendo il tuo utente proprietario e dando i privilegi:
1 Esegui, 2 Scrivi, 4 Leggi
1 + 2 + 4 = 7 significa (rwx)
2 + 4 = 6 significa (rw)
, infine, per l'accesso alla memoria, ug + rwx significa che stai dando all'utente e al gruppo un 7


1
non so perché a molti sviluppatori piace usare 777 ... in qualche modo a loro non importava del loro sistema ..
ZeroOne

15

Per gli utenti vagabondi, la soluzione è:

(in vagabondo) cache artigianale php: chiaro

(fuori dal vagabondo) chmod -R 777 app / archiviazione

(in vagabondo) compositore dump-autoload

È importante assicurarsi di immergersi nel proprio ambiente locale e non all'interno del vagabondo!


6
777 non è troppo aperto?
simo

3
Voglio dire, per la produzione, certo. Ma questo è un ambiente di sviluppo locale. 777 era quello che stava usando il poster originale e altre risposte.775 o 755 potrebbero funzionare a seconda.
Brendan,

12

Riprova con chmod -R 755 /var/www/html/test/app/storage. Utilizzare con sudo per Operation not permittedin chmod. Utilizzare Controlla l'autorizzazione del proprietario se l'errore persiste.


Non funziona. Tutte le directory all'interno dell'app hanno l'autorizzazione drwxrwxrwx
vishnub1626

@tav puoi controllare l'autorizzazione del proprietario per la tua cartella di test?
Khay

Stesso drwxrwxrwx. Risolto il problema usando i suggerimenti di @ vsmoraes (vedi i commenti)
vishnub1626

4
chmod 777 è un rischio per la sicurezza
Yogesh Kamat,

9

Secondo Laravel 5.4, che è l'ultimo di cui sto scrivendo, se hai qualche problema come questo, devi cambiare l'autorizzazione. NON ASCOLTARE A CHIUNQUE CHE TI DICE DI IMPOSTARE 777 PER QUALSIASI DIRECTORY. Ha un problema di sicurezza. Modifica l'autorizzazione della cartella di archiviazione in questo modo

sudo chmod -R 775 storage

Modifica l'autorizzazione della cartella bootstrap in questo modo

sudo chmod -R 775 bootstrap/cache

Ora assicurati di eseguire entrambi i comandi dalla directory dell'applicazione. In futuro non dovrai affrontare problemi riguardanti l'autorizzazione. 775 non compromette la sicurezza della tua macchina.


7

Suggerisci l'autorizzazione corretta, se per Apache,

sudo chown -R apache:apache apppath/app/storage

Laravel Forge usa: sudo chown -R forge: forge ~ / project / storage / sudo chown -R forge: forge ~ / project / bootstrap / cache /
Flappy

6

Se hai Laravel 5 e cerchi una soluzione permanente, sia l' php artisanutilizzo della riga di comando applicabile che il server Apache usano questo:

sudo chmod -R 777 vendor storage
echo "umask 000" | sudo tee -a /etc/resolv.conf
sudo service apache2 restart

Vedi spiegazione dettagliata qui .


8
sembra una cattiva idea usare 777
Randy L

umask 000 in resolv.conf ?! dove stanno ottenendo queste informazioni? questa è una riga non valida in resolv.conf. Per favore, ignora questa e tutte le 777 "soluzioni" là fuori
higuita, il

controlla l'URL e non trova alcuna opzione umask in resolv.conf linux.die.net/man/5/resolv.conf
higuita

6

PER CHIUNQUE ESEGUE UN SO CON SELINUX: Il modo corretto di consentire a httpd di scrivere nella cartella di archiviazione laravel è:

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'

Quindi applicare immediatamente le modifiche:

sudo restorecon -F -r '/path/to/www/storage'

SELinux può essere una seccatura da affrontare, ma se è presente allora CONSIGLIAMO VIVAMENTE di impararlo anziché bypassarlo del tutto.


il mio esatto problema in centos 7 fresco era simile. non diceva il permesso di scrivere ma tutti erano 777 per i test. Quindi questo post mi ha davvero risparmiato tempo dopo tutto il controllo generale.
HumaN,

1
Questa è la soluzione corretta, anche se penso che il tipo SELinux corretto dovrebbe essere httpd_sys_rw_content_t sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug

4

Ho avuto lo stesso problema e i passaggi seguenti mi hanno aiutato a risolvere il problema.

  1. Scopri l'utente apache - creato un file test.php nella cartella pubblica con il codice

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

Ed esegui il file dal browser web. Darebbe all'utente apache. Nel mio caso, è ec2-user mentre stavo usando aws con cronjob installato in /etc/cron.d/. Potrebbe essere un utente diverso per gli altri.

  1. Esegui il comando seguente nella riga di comando.

sudo chown -R ec2-user:<usergroup> /app-path/public

È necessario identificare e utilizzare il giusto "utente" e "gruppo utenti" qui.


4

Se usi Linux o Mac, anche tu puoi eseguire ssh terminal. Puoi usare il terminale per eseguire questo comando,

 php artisan cache:clear 
 sudo chmod -R 777 storage
 composer dump-autoload

Se si utilizza Windows, è possibile eseguire utilizzando git bash.

 php artisan cache:clear 
 chmod -R 777 storage
 composer dump-autoload

È possibile scaricare il modulo git https://git-scm.com/downloads .



2

Ogni volta che cambio app.php mi viene negata l'autorizzazione a scrivere bootstrap / cache / services.json, quindi l'ho fatto per risolverlo:

chmod -R 777 bootstrap/cache/

8
chmod 777 è un rischio per la sicurezza
Yogesh Kamat

2
rm storage/logs/laravel.log  

risolto questo per me


2

Impostare il permesso su 777 è sicuramente un'idea terribile!

... ma

Se ricevi un errore di autorizzazione connesso alla cartella "storage", questo è quello che ha funzionato per me:

1) Impostare "storage" e le relative autorizzazioni per le sottocartelle su 777 con

sudo chmod -R 777 storage/

2) Nel browser vai alla home page di laravel laravel / public / (laravel creerà i file di archiviazione iniziale necessari)

3) Restituisci l'autorizzazione 775 sicura allo spazio di archiviazione e alle sue sottocartelle

sudo chmod -R 775 storage/

2

Se si utilizza laradock, provare chown -R laradock:www-data ./storagenel contenitore dell'area di lavoro


1

Nel mio caso, la soluzione era cambiare il permesso app/storage/framework/viewse le app/storage/logsdirectory.


0

Se qualcun altro si imbatte in un problema simile con errore di permessi del file fopen, ma è abbastanza saggio da non vedere ciecamente 777 ecco il mio suggerimento.

Controlla il comando che stai utilizzando per le autorizzazioni necessarie per apache:

fopen('filepath/filename.pdf', 'r');

'R' significa aperto in sola lettura e se non stai modificando il file, questo è come dovresti averlo impostato. Ciò significa che apache / www-data necessita almeno dell'autorizzazione di lettura su quel file, che se il file viene creato tramite laravel avrà già l'autorizzazione di lettura.

Se per qualsiasi motivo devi scrivere nel file:

fopen('filepath/filename.pdf', 'r+');

Quindi assicurati che apache disponga anche delle autorizzazioni per scrivere sul file.

http://php.net/manual/en/function.fopen.php


0

Basta avviare il server utilizzando artisian

php artisian serve

Quindi accedi al tuo progetto dall'URL specificato:

inserisci qui la descrizione dell'immagine


0

Ho lo stesso problema quando eseguo Vagrant su Mac. risolto il problema modificando l'utente del server Apache nel file https.conf:

# check user for php
[vagrant] ubuntu ~ $ php -i | grep USER
USER => ubuntu
$_SERVER['USER'] => ubuntu
[vagrant] ubuntu ~ $ 

Esegui apache sotto l'utente php anziché il demone utente per risolvere il problema di accesso ai file con php

# change default apache user from daemon to php user
sudo sed -i 's/User daemon/User ubuntu/g' /opt/lampp/etc/httpd.conf
sudo sed -i 's/Group daemon/Group ubuntu/g' /opt/lampp/etc/httpd.conf

ora, il file cache creato da php può essere letto e modificato da apache senza mostrare alcun errore di autorizzazione di accesso.


0

Dopo un sacco di tentativi ed errori con i permessi della directory sono finito con un'epifania ... non c'era più spazio sulla partizione del disco. Volevo solo condividere per assicurarsi che nessun altro fosse abbastanza stupido da continuare a cercare la soluzione nella direzione sbagliata.

In Linux puoi usare df -hper controllare le dimensioni del tuo disco e lo spazio libero.


0

Questo problema è in realtà causato da diversi utenti che vogliono write/readarchiviare ma negato causano proprietà diverse. forse tu come "root" hai installato laravel prima di accedere al tuo sito come utente "laravel" dove "laravel" è la proprietà predefinita, quindi questo è il vero problema qui. Pertanto, quando l'utente "laravel" desidera leggere / scrivere tutti i file sul disco come impostazione predefinita, per essere negato, tale file ha la proprietà di "root".

Per risolvere questo problema puoi seguire in questo modo:

sudo chown -hR your-user-name /root /nameforlder

o nel mio caso

sudo chown -hR igmcoid /root /sublaravel

Nota:

  1. root come nome prima proprietà che ha installato prima
  2. your-user-name come proprietà predefinita che effettivamente scrive / legge nel sito.
  3. namefolder come cartella dei nomi che desidera modificare la proprietà.

0

Ho avuto gli stessi errori nel mio progetto ...
Ma ho scoperto che mi ero dimenticato di inserire il enctypemio modulo.

<form method="#" action="#" enctype="multipart/form-data">

Spero che aiuti in qualche modo ...


0

Mentre lavoravo su Windows 10 con Laragon e Laravel 4, mi sembrava che non ci fosse modo di cambiare le autorizzazioni manualmente, poiché l'esecuzione dei chmodcomandi nel terminale integrato di Laragon non aveva alcun effetto.

Tuttavia, in questo terminale è stato possibile accedere alla cartella di archiviazione e aggiungere manualmente le cartelle desiderate in questo modo:

cd app/storage
mkdir cache
mkdir meta
mkdir views
mkdir sessions

Il cdcomando nel terminale porta alla cartella (potrebbe essere necessario regolare questo percorso per adattarlo alla struttura del file). Il mkdircomando creerà la directory con il nome dato.

Non ho avuto l'opportunità di testare questo approccio in Laravel 5, ma mi aspetto che un approccio simile dovrebbe funzionare.

Naturalmente potrebbe esserci un modo migliore, ma almeno questa è stata una soluzione ragionevole per la mia situazione (correggere l'errore:) file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream.


-1
  1. Innanzitutto, elimina la cartella di archiviazione, quindi crea nuovamente la cartella di archiviazione.
  2. All'interno della cartella di archiviazione creare un nuovo nome di cartella come framework.
  3. All'interno della cartella del framework creare tre nomi di cartelle come cache, sessioni e viste.

Ho risolto il mio problema facendo questo.


-4

Ho provato a dare l' 777accesso alla cartella di archiviazione e ha funzionato per me

1) vai alla tua directory radice laravel, ( /var/www/htmlper me) ed esegui il seguente comando

chmod 777 -R storage

2
Non impostare le autorizzazioni su 777 in quanto ciò rende la directory visibile e modificabile per tutti coloro che possono vedere la directory. Questo non è raccomandato!
CodeNinja,
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.