PHPにファイルとフォルダへの書き込み権限を与える

PHPにファイルとフォルダへの書き込み権限を与える

さらに明確にするために更新しました:

によるとhttp://expressionengine.com/user_guide/installation/installation.html、それは言う:

ほとんどのUnixホストでは、以下が一般的ですが、より制限的な権限を使用できるかどうかホストに確認してください。PHP がファイル (666) とフォルダ (777) に書き込めるようにするWindows サーバーでは以下は適用されませんが、ファイルとフォルダーが ExpressionEngine によって書き込み可能であることを確認する必要があります。このためにはホストに問い合わせる必要がある場合があります。

これが何を意味するのかよく分かりません。私が所有者である場合、特定のファイルとフォルダーをそれぞれ 666 と 777 に変更できますが、上記のことから、PHP にもこれを許可する必要があるように思えます。

元の質問:

PHP が特定のファイル (666) とフォルダー (777) に書き込めるようにする必要があります。

どうすればいいですか?

答え1

私は、rahmu と MV の回答を技術的な解決策で補完します。以下はすべて UNIX 系システムにのみ有効です。

ACL を使用した例については、chmod/chown セクションをスクロールしてください。ACL は UNIX ファイル モードよりも強力なツールです。

ウェブサーバーのユーザー名を見つける

まず、Web サーバーを実行するユーザー名を知る必要があります。Apache を使用している場合、ユーザー名はapacheまたはhttpdwww-dataなどになります。ほとんどの Debian 系システムでは、Apache は ですwww-data。nginx の場合も、一般的に ですwww-data

確認するには、次の操作を試してください。

ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1

このコマンドが返すユーザー名が一貫していることを確認する(たとえば、私は 99% の時間 nginx を使用していますが、このコマンドはtomcat7、一度インストールした Java Web サーバーを返します)


ウェブサーバーへの権限付与:chmodおよびchown

chmod666 または 777 の を実行すると(質の悪いドキュメントやチュートリアルでこの種の問題が発生した場合の定番の解決策)、魔法のように動作するようになりますが、安全ではありません。666 または 777 の権限を与えると、「その他」にアクセスできるようになります。したがって、Apache だけでなく、grandmotherおよび もアクセスできるようになりますnsa(これらのユーザー アカウントがマシン上に存在することが条件ですが、テストやトラブルシューティングのためだけの場合を除いて、これを行うことは避けてください)。

もっと具体的に、あなたと Apache だけに権限を与える方がよいでしょう。ファイルのグループを変更して、Web サーバーにファイルの完全な制御権を与えます。これを行うには、所有者を再帰的に変更します。

chown -R www-data:www-data your/folder/

しかし、おそらく、グループのみを変更して、ファイルへのフルアクセスを維持したい場合があります。

chown -R yourusername:www-data your/folder/

次に、適切な操作を行って、chmodグループにwww-dataあなたと同じ権限を与えます。たとえば、現在のモードが640の場合(6 はあなた用、4 は www-data 用、0 はその他用、つまり -rw-r----- に変換されます)660に設定(6 はあなた用、6 は www-data 用、0 はその他用、つまり -rw-rw---- に変換されます)ファイル モードの詳細については、rahmu の回答を参照してください。これは古いものですが、優れたメカニズムです。

で難解な数字を操作するのを避けるためにchmod、次の構文を使用することもできます。

chmod -R g+rw your/folder/

これは、「グループ ( g) に、フォルダー ( ) に対する+読み取り ( ) および書き込み ( ) 権限を再帰的に追加する ( )」という意味です。rwyour/folder/-R

90% のケースではこれで十分でしょう。


私の推奨方法: ACL (アクセス制御リスト) の使用

最初の解決策だけでは十分でないこともあります。Symfony フレームワーク大量のデータをログに記録してキャッシュします。そのため、適切なフォルダーへの書き込みアクセス権が必要です。

また、 CLI の Symfony コンソール (自分のユーザー アカウントの下) と Web (Web サーバー ユーザー) を並行して使用している場合、 chmod/chownメソッドでは不十分な可能性があります。Symfony は権限を常に変更するため、多くの問題が発生します。

この場合、多くの UNIX システムで権限を管理するためのより高度な方法である ACL (アクセス制御リスト) を使用します。

ここでは、Symfonyの公式ドキュメントに記載されているコマンド(必要に応じapp/cacheて変更してくださいapp/logs):

サポートされているシステムchmod +a(Debian/Ubuntu以外)

sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

サポートされていないシステムの場合chmod +a(最も一般的)

ツールが必要になりますsetfacl。ツールはデフォルトでシステムにインストールされている可能性がありますので、setfacl -vコマンドが使用可能かどうかを確認してください。

コマンドが利用できない場合は、そしてUbuntu 14.04 以降を使用している場合は、ツールをインストールするだけです。

sudo apt install acl

それ以外の場合は、パーティションのマウント方法を変更する必要がある可能性があるため、OSのドキュメントに従ってください(Ubuntuのドキュメントはこちら)。

そして、ここにあります:

sudo setfacl  -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs

この方法ではこれまで何の問題もありませんでした。満足できなかったら返金します。

答え2

ファイルの所有者が誰であっても、666のパーミッションと777で十分です。最後の桁は、システム上のユーザーがアクセス権を持っているかどうかを確認します。これは最も簡単な方法ですが、まさにその理由から、最も安全な方法とは言えません。

より良い方法

まず理解しておくべきことはUnix の権限の仕組みこのリンクで私が与えた回答を理解するために、権限は数字に変換できることに注意してください。

  • 0:---
  • 1:--x
  • 2:-w-
  • 3:-wx
  • 4:r--
  • 5:r-x
  • 6:rw-
  • 7:rwx

A はchmod 666、 への権限を変更することと同等ですrw-rw-rw

次に、PHP スクリプトを実行しているユーザーを特定する必要があります。通常、これは Web サーバーを実行しているユーザーです。これを行う方法の例は次のとおりです(Apache を Web サーバーの名前に置き換えることができます)。

スクリプトを実行しているユーザーと、言及したファイルの所有者がわかったら、適切な権限を設定するのはあなた次第です。システム上のユーザーを危険にさらすと、潜在的に悲惨な結果を招く可能性があります。

答え3

Expression Engine は、一部のファイルとディレクトリへの読み取り + 書き込みアクセスを必要とする他の多くの PHP Web アプリケーションと同様です。たとえば、EE では、config.php および database.php ファイルへの書き込みアクセスと、ファイル アップロード ディレクトリへの書き込みアクセスが必要です。

ドキュメントに記載されている内容は、ほとんどのサーバーが PHP を mod_php として実行し (したがって、Web サーバーの権限で実行される)、自分のユーザーを使用して FTP (または同様のもの) でファイルをアップロードすることになるため、それらのファイルとディレクトリには権限 666 (誰でも読み取りと書き込みが可能) と 777 (誰でも読み取り、書き込み、参照が可能) を付与する必要があるということです。

これは最も安全な方法ではありませんが、特にホスティング サービスを使用している場合には、最も簡単な方法です。

ただし、EE の指示にもあるように、ホスティング プロバイダーに問い合わせてください。一部のプロバイダーでは mod_php ではなく fastcgi、suphp または別のバージョンが使用されているためです。これらのサーバーは PHP を自分のユーザーとして実行するため、アップロードしたすべてのファイルは、PHP および EE スクリプトによって作成されたすべてのファイルによって既に読み取りおよび書き込み可能です。その場合、PHP によってアクセスされるファイルとディレクトリには、600 および 700 のアクセス権を付与する必要があります。Web サーバー (PHP ランタイムではない) によって直接アクセスされるその他のファイルには、666 および 777 のアクセス権が必要です。

関連情報