web-dev-qa-db-ja.com

file_put_contents(meta/services.json):ストリームを開けませんでした:アクセス権が拒否されました

私はLaravelに慣れていません。 http://localhost/test/public/を開こうとしたところ

例外ハンドラでエラーが発生しました。

私は歩き回り、chmod -R 777 app/storageを使用してstorage directoryの許可を変更しましたが、役に立ちませんでした。

debug=>trueapp.phpに変更してページにアクセスし、例外ハンドラにErrorを入れました。

ストリームまたはファイル "/var/www/html/test/app/storage/logs/laravel.log"を開けませんでした:ストリームを開けませんでした:/ var/www/html/test/bootstrap/compileで許可が拒否されました。 php:8423

それからコマンドchmod -R 644 app/storageを使ってstorageディレクトリのパーミッションを変更し、 'Error in exception handler'エラーがなくなり、ページがロードされました。しかし、そこに私はこれを得ています:

file_put_contents(/var/www/html/laravel/app/storage/meta/services.json):ストリームを開けませんでした:アクセス権が拒否されました

153
vishnub1626

vsmoraes からの提案は私のために働いた:

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

注:どのリモートサーバでもこれを行わないでください(DEV OR PRODUCTION)

私がこの質問をしたとき、これは私のローカルホストの問題で、仮想マシンで動作していました。それで私は777を設定することは十分に安全であると思いました、しかし、人々は彼らがあなたが異なる解決策を探すべきであると言うとき正しいです。最初に775をお試しください

305
ecairol

Laravelでこの問題に直面しているGoogleユーザー向け5。

これは、異なるユーザーが異なるパーミッションでstorage/logsフォルダー内の同じログファイルに書き込もうとすることにより引き起こされるパーミッションの問題です。

laravel configはおそらく毎日エラーを記録するように設定されているため、Webサーバー(Apache/nginx)は、環境によっては_wwwのようなデフォルトユーザーの下にこのファイルを作成する可能性がありますOSXまたは* NIXシステムのwww-dataでは、職人のコマンドを実行してエラーが発生した場合に問題が発生するため、職人はこのファイルを書き込みますが、PHP端末上で実際にログインユーザーとは別のユーザーによって実行されている場合は、次のコマンドを実行してチェックアウトできます。

php -i | grep USER

ログインユーザーがそのログファイルをウェブサーバーに作成した場合、laravelはデフォルトで655権限でログファイルを書き込むため、オーナーにのみ許可されるため、ウェブサーバーにエラーを書き込むことはできません。書いて。

この一時的な問題を修正するには、このファイルにグループ664のアクセス許可を手動で付与して、ログインユーザーとWebサーバーユーザーの両方がそのログファイルに書き込みできるようにする必要があります。

この問題を永久に回避するには、この回答ディレクトリから権限を継承することにより、storage/logs dir内に新しいファイルを作成するときに適切な権限を設定することをお勧めします https://unix.stackexchange.com/ a/115632 は、それに取り組むのに役立ちます。

67
Adriano Rosa

Laravel 5を使用しているすべての人にとって、HomesteadとMacはこれを試します。

mkdir storage/framework/views
41
Hans P

777権限を与えてはいけません。これはセキュリティ上のリスクです。 Ubuntuユーザのために、Laravel 5に、ディレクトリストレージの所有者を再帰的に変更することをお勧めします。

フォローしてみてください。

Sudo chown -R www-data:www-data storage

Ubuntuベースのシステムでは、www-dataはApacheユーザーです。

37
RibeiroSt

時々SELINUXはこの問題を引き起こしました。このコマンドでselinuxを無効にすることができます。

Sudo setenforce 0
30
mahrad

問題が解決しました

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

これにより、アプリ、フレームワーク、ログへの書き込み権限が有効になります。

18
user3470929

気の利いたユーザにとっての解決策は次のとおりです。

(vagrant)php職人のキャッシュ:クリア

(vagrantの外側)chmod -R 777アプリ/ストレージ

(vagrant)作曲家ダンプオートロード

Vagrantの内部ではなく、自分のローカル環境でchmodを実行することが重要です。

15
Brendan

絶対に許可を与えないでください777!

あなたの端末のlaravelプロジェクトのディレクトリに行き、書いてください:

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

このようにして、あなたはあなたのユーザを所有者にして特権を与えます:
1実行、2書き込み、4読み取り
1 + 2 + 4 = 7は(rwx)を意味します
2 + 4 = 6は(rw)を意味します
最後に、ストレージアクセスの場合、ug + rwxはユーザーとグループに7を与えることを意味します。

12
Ibrahim W.

chmod -R 755 /var/www/html/test/app/storageでもう一度やり直してください。 chmodのOperation not permittedにSudoと一緒に使用します。それでもエラーが発生する場合は、[所有者権限の確認]を使用してください。

11
Khay

Laravel 5.4に従って、これを書いている時点では最新のものです。このような問題がある場合は、許可を変更する必要があります。 ディレクトリを777に設定する必要がある人は誰にも聞かないでください。 セキュリティ上の問題があります。保存フォルダの権限をこのように変更する

Sudo chmod -R 775 storage

ブートストラップフォルダのアクセス権をこのように変更します

Sudo chmod -R 775 bootstrap/cache

アプリケーションディレクトリから両方のコマンドを実行していることを確認してください。あなたは許可に関して将来問題に直面することはないでしょう。 775はあなたのマシンのいかなるセキュリティも危険にさらしません。

8
Koushik Das

Apacheの場合は、正しい許可を提案してください。

Sudo chown -R Apache:apache apppath/app/storage
7
Sean

Laravel 5 があり、恒久的な解決方法を探している場合は、php artisanコマンドラインの使用法とApacheサーバーの両方に適用できます。

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

詳しい説明を見る ここ

6
ademin

SELINUXでOSを走らせている人のために:httpdがlaravelストレージフォルダに書き込めるようにする正しい方法は:

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

すぐに変更を適用するには:

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

SELinuxは対処するのが面倒かもしれませんが、それが存在するのであれば私はそれを完全に迂回するのではなくそれを学ぶことを強くお勧めします。

6
Heather Gaye

私は同じ問題を抱えていました、そして、以下のステップは私が問題を解決するのを助けました。

  1. Apacheユーザーを探す - パブリックフォルダにtest.phpファイルを作成し、そのコードを書きます。

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

そしてWebブラウザからファイルを実行します。それはApacheユーザーになります。私の場合、cronjobが/etc/cron.d/にインストールされたawを使用していたので、ec2ユーザーです。それは他の人にとっては異なるユーザーかもしれません。

  1. コマンドラインで下記のコマンドを実行してください。

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

ここで正しい「ユーザー」と「ユーザーグループ」を識別して使用する必要があります。

4
KiranD

使用するXampp:

cd /Applications/XAMPP/htdocs  
chmod -R 775 test/app/storage
3
cristianojeda
rm storage/logs/laravel.log  

私のためにこれを解決しました

2
aad1992

Laradockを使用している場合は、ワークスペースコンテナでchown -R laradock:www-data ./storageを試してください。

2
Rob L

App.phpを変更したときはいつでも、bootstrap/cache/services.jsonの書き込みを拒否されたアクセス権があるので、修正しました。

chmod -R 777 bootstrap/cache/
2
malhal

私の場合の解決策はパーミッションをapp/storage/framework/viewsapp/storage/logsディレクトリに変更することでした。

1
Den

プロジェクトで同じエラーが発生しました。
しかし、私は自分の形にenctypeを入れるのを忘れたことを知りました。

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

どういうわけかそれがどこかに役立つことを願っています...

0
Vpa

他の誰かがfopenファイルのアクセス権エラーで同様の問題に遭遇したが、盲目的にここで777をchmodしないように十分に賢明な場合は私の提案です。

使用しているコマンドで、Apacheに必要な権限を確認してください。

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

「r」は読み取り専用で開くことを意味します。ファイルを編集していない場合は、これを設定する必要があります。これはApache/www-dataが少なくともそのファイルの読み込み許可を必要とすることを意味します。ファイルがlaravelを通して作成された場合、それはすでに読み込み許可を持っているでしょう。

何らかの理由でファイルに書き込む必要がある場合

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

それから、Apacheにもファイルへの書き込み権限があることを確認してください。

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

0
Kyle Burkett

私は同様の問題を抱えていました。 Laravel 5.2および5.5で(許可が正しく設定されている場合は許可が拒否されました)

問題はSELinuxが有効になっていて、777モードでもApacheがファイルを書き込めないことでした。質問と回答については、 500応答の回答Laravel(不明なUnexpectedValueException:Laravel.log } _を参照してください。

多分これはあなたのために問題を解決します。

0
RoDo

LaragonとLaravel 4を使用してWindows 10で作業している間、Laragon-in-built-terminalでchmod-コマンドを実行しても効果がないため、アクセス許可を手動で変更する方法はありません。

ただし、この端末ではstorageフォルダに移動して手動で次のように目的のフォルダを追加することができました。

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

ターミナルのcd-コマンドでフォルダに移動します(ファイル構造に合うようにこのパスを調整する必要があるかもしれません)。 mkdir-コマンドは与えられた名前でディレクトリを作成します。

私はLaravel 5でこの方法をテストする機会がありませんでしたが、同様の方法でうまくいくはずです。

もちろんもっと良い方法があるかもしれませんが、少なくともこれは私の状況では妥当な回避策でした(エラーを修正する:file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream)。

0
Virginia

artisianを使ってサーバーを起動するだけです。

php artisian serve

次に、指定されたURLからプロジェクトにアクセスします。

enter image description here

0
wajih

ディレクトリのアクセス権に関する多くの試行錯誤の結果、私はエピファニーになりました...ディスクのパーティションにはスペースが残っていませんでした。間違った方向で解決策を探し続けるのに他の誰もが愚かでないことを確認するために共有したいと思いました。

Linuxでは、df -hを使ってディスクサイズと空き容量をチェックできます。

0
Frank

777に許可を設定することは間違いなくひどいアイデアです!

…でも

あなたが "ストレージ"フォルダに接続されているアクセス許可エラーを得ているなら、それは私のために働いたものです:

1) "storage"とそのサブフォルダの許可を777に設定します。

Sudo chmod -R 777 storage/

2)ブラウザでlaravelのホームページlaravel/public /に移動します(laravelは必要な初期保存ファイルを作成します)

3)安全な775許可をストレージとそのサブフォルダーに返却する

Sudo chmod -R 775 storage/
0
Nika Tsogiaidze

この問題は、実際にはwrite/readファイルを作成しようとしたが拒否されたユーザーが異なるために、所有権が異なります。多分あなたは 'laravel'デフォルトの所有権である 'laravel'ユーザとしてあなたのサイトにログインする前に 'root'としてlaravelをインストールしたので、これはここで実際に本当の問題です。そのため、ユーザ 'laravel'がデフォルトでディスク内のすべてのファイルを読み書きしたいときに、そのファイルが 'root'による所有権を持つようにします。

この問題を解決するには、次のようにします。

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

または私の場合

Sudo chown -hR igmcoid /root /sublaravel

脚注:

  1. 以前にインストールした名前の最初の所有者としてのroot
  2. 実際にサイトで書き込み/読み取りを行うデフォルトの所有者としてのyour-user-name
  3. 所有権を変更する名前フォルダとしてのnamefolder
0
Bliss Jaspis

私はMac上でvagrantを実行するときに同じ問題を抱えています。 https.confファイルでApacheサーバーのユーザーを変更することで問題を解決しました。

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

Phpによるファイルアクセスの問題を解決するために、ユーザーデーモンではなくphpユーザーでApacheを実行します。

# 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

現在、phpで作成されたキャッシュファイルは、アクセス許可エラーを表示することなく、Apacheによって読み取られ編集されることができます。

0
nigam214