PHPを使用してファイルを作成しようとしていますが、機能しません。私はこれが書き込みアクセスを持っていないためだと仮定しています(以前は常に問題でした)。フォルダーchmod 0777を作成して、これが問題であるかどうかをテストしようとしましたが、そのディレクトリのすべてのスクリプトが500エラーメッセージを返すようになりました。 PHPにファイルシステムへの書き込みアクセス権を付与して、ファイルを作成できるようにするにはどうすればよいですか?
編集:Apacheを使用したHostgator共有ホスティングでホストされます。
編集2:誰かがコードを要求しました:コードはGd画像スクリプトです。それが呼び出されるたびに画像を作成していたので、私はそれの残りが機能することを知っています。今、私は新しいテキストが追加されたときにそれらを作成し、フォルダに保存しようとしています。私が持っている書き込み行は次のとおりです。imagejpeg(null、$ file、85);
また、テストファイルを作成して、破損したスクリプト(主にtizagからコピーされたもの)かどうかを確認します。 http://gearboxshow.info/rkr/lesig.jpg/testfile.txt (私はしない)ここにコードを適切に投稿するかどうか/どのように投稿するかがわかります。ここにPHPスクリプトの内容からPHPタグを除いたものを示します。)
13,13,1(個別の行)を返すため、何かを書いたと思われるように見えますが、testfile.txtは空白(空のファイルをアップロードした)または存在しない(削除した場合)。
編集3:サーバーはCentOSを実行します。
簡単な方法は、最初にPHPにディレクトリ自体を作成させることです。
<?php
$dir = 'myDir';
// create new directory with 744 permissions if it does not exist yet
// owner will be the user/group the PHP script is run under
if ( !file_exists($dir) ) {
mkdir ($dir, 0744);
}
file_put_contents ($dir.'/test.txt', 'Hello File');
これにより、面倒なアクセス許可が不要になります。
ディレクトリの所有者をApacheを実行しているユーザーに設定します。多くの場合、Linuxには誰もいません
chown nobody:nobody <dirname>
これにより、フォルダは誰でも書き込み可能になりませんが、Apacheでも書き込み可能です:)
要約:ディレクトリの所有者を、PHPが使用するユーザー(Webサーバーユーザー)に設定する必要があります。
ステップ1:PHPユーザーを決定する
次を含むPHPファイルを作成します。
<?php echo `whoami`; ?>
Webサーバーにアップロードします。出力は次のようになります。
www-data
したがって、PHPユーザーはwww-data
です。
ステップ2:ディレクトリの所有者を決定する
次に、コマンドラインを使用してWebディレクトリの詳細を確認します。
ls -dl /var/www/example.com/public_html/example-folder
結果は次のようになります。
drwxrwxr-x 2 exampleuser1 exampleuser2 4096 Mar 29 16:34 example-folder
したがって、ディレクトリの所有者はexampleuser1
です。
ステップ3:ディレクトリ所有者をPHPユーザーに変更
その後、Webディレクトリの所有者をPHPユーザーに変更します。
Sudo chown -R www-data /var/www/example.com/public_html/example-folder
Webディレクトリの所有者が変更されたことを確認します。
ls -dl /var/www/example.com/public_html/example-folder
結果は次のようになります。
drwxrwxr-x 2 www-data exampleuser2 4096 Mar 29 16:34 example-folder
したがって、example-folder
の所有者はPHPユーザーに正常に変更されました:www-data
。
完了!PHPはディレクトリに書き込むことができるはずです。
次のコマンドを使用して、どのユーザーがhttpdプロセスを所有しているかを最初に把握する
ps aux | grep httpd
次のような複数行の応答が返されます。
phpuser 17121 0.0 0.2 414060 7928 ? SN 03:49 0:00 /usr/sbin/httpd
ここで、最初の列はユーザー名を示しています。これで、ファイルを書き込もうとしているユーザーがわかりました。この場合はphpuser
です。これで、PHPスクリプトが何かを書き込もうとしているディレクトリのアクセス許可を設定できます。
Sudo chown phpuser:phpuser PhpCanWriteHere
Sudo chmod 755 PhpCanWriteHere
PHPのchmod()を使用して、フォルダーのアクセス許可を変更できます。コマンドの使用方法に関する詳細はこちら: http://php.net/manual/en/function.chmod.php
パーミッションを777(world writable)に設定したときに500エラーが発生した場合、そのようなファイルの実行を防ぐためにサーバーがセットアップされていることを意味します。これはセキュリティ上の理由で行われます。その場合は、ファイルに対する最高のアクセス許可として755を使用します。
PHPドキュメントを実行しているフォルダーに生成されたerror_logファイルがある場合、最後のいくつかのエントリーを表示する必要があります。これにより、スクリプトが失敗している場所がわかります。
PHPファイル操作のヘルプについては、リソースとして http://www.tizag.com/phpT/filewrite.php を使用します。
HostGatorでは、ファイルをCMOD 644、Foldersを755に設定する必要があることがわかりました。これは技術サポートに基づいて行ったため、HostGatorで動作します
ディレクトリへの書き込みアクセスを許可する最良の方法。
$dst = "path/to/directory";
mkdir($dst);
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777 {} +");
分析するためにselinuxをpermissiveに設定できます。
# setenforce 0
Selinuxはログに記録しますが、アクセスは許可します。そのため、/var/log/audit/audit.log
で詳細を確認できます。 selinuxのコンテキストを変更する必要があるかもしれません。これに注目して、chcon
コマンドを使用します。必要に応じて、audit.log
を提示して、より詳細な回答を入手してください。
問題を解決した後にselinuxを有効にすることを忘れないでください。 selinuxを強制的に維持します。
# setenforce 1
chmodでは、ファイルの所有権を設定できません。ファイルの所有権を設定するには、chownコマンドを使用する必要があります。
私は同じ問題を抱えていました:
0777をphpディレクトリに渡すことに消極的だったので、権利0777でtmpディレクトリを作成し、書き込み先のファイルを作成します
私のphpディレクトリは引き続き保護されます。誰かがtmpディレクトリをハッキングしても、サイトは通常どおり動作し続けます。
私はUbuntuを実行していますが、上記のようにnobody:nobodyはUbuntuでは動作しません。エラーが表示されます:
chown: invalid group: 'nobody:nobody'
代わりに、次のように「nogroup」を使用する必要があります。
chown nobody:nogroup <dirname>