11

私は現在、ブラウザブラウザがWebページを参照するときに実行されているphpスクリプトを持っています。私がやろうとしているのは、スクリプトの実行時に変数を格納するテキストファイルを作成することです。フォルダの所有者はapacheですが、厳密にはテスト目的で、全員が読み取り/書き込みを行っています。(パーミッションの問題かもしれないと思いました)サーバーでSELINUXが有効になっていて、コンソールからスクリプトを実行すると、適切なディレクトリにテキストファイルが作成されます。

file_put_contents("My working file location", $myString);

この行を使用してテキストファイルを作成および作成しようとしています。ファイルの場所が機能することはわかっています。これは、ファイルを実行してオフラインモードで作成でき、IEがコンソールから実行できるためです。問題は、書き込もうとしている変数がHTTP Postを介して入力され、ブラウザーを介してスクリプトを実行するとき、またはapacheがスクリプトを実行するときに、ファイルを書き込んだり作成したりしないことです。このスクリプトにこのテキストファイルを書き込むために、構文の書き込み/変更へのアクセスを許可するには、何をする必要がありますか?

4

5 に答える 5

14

問題は、指定したファイルの場所に書き込む権限がないapacheが原因である可能性があります。lsそのディレクトリに移動し、次のコマンドを使用して権限とグループの所有権を確認します。

cd "My working file location"
ls -l .

出力には、ディレクトリの権限、所有者、およびグループを示す3つの列があります。apacheほとんどの場合、それらはrootによって所有されており、ディレクトリに書き込むための権限を持っていません。

この場合、ファイルを作成しようとすると、apacheログにエラーが表示されます。ブラウザでスクリプトを実行しながら、ログを調整してみてください。

tail -f /var/log/apache2/error.log
于 2013-02-15T18:17:02.243 に答える
2

私は最近同じ問題を抱えていて、この質問に出くわしました。残念ながら、OPはコメントでchoppyfireballsが自分の解決策を見つけ、私たちの誰にも役立たない答えを受け入れたと述べました...その後、検索してfile_put_contentsを再び機能させることに成功した後、私は自分の解決策を共有することにしました。

私のファイルとディレクトリのパーミッションは、書き込みを受け入れるのに問題ありませんでした(ディレクトリがchmod 757これであるかどうかを確認してください。これにより、rootやのユーザーがその場所にファイルを書き込むことができます)。それでも機能しない場合は、システムがおそらくSELinux(Security Enhanced Linux)システムであるためです。

これを確実に記述したい場合はsetenforce 0、selinuxをパーミッシブモードにし、スクリプトを再度実行します。それが機能する場合は、問題が十分に説明されていることを意味します。

その場合は、selinuxをオンに戻して、プロジェクトのディレクトリがあるディレクトリでsetenforce 1試してください。ls -Zlこれはあなたに次のような行を与えるでしょう

drwx---r-x.  9  root   root  system_u:object_r:httpd_sys_content_t:s0  4096  Dec  8  00:25  project

または別の何かですが、コンテキストを1つのディレクトリからこのディレクトリに転送するためにhttpd_sys_content_t使用した場合。ただし、ディレクトリのコンテキストを変更する必要があるため、chconお持ちでない場合は問題ありません。httpd_sys_content_t

public_content_rw_tまず、ファイルを書き込むためにコンテキストを受け入れる必要があります。タイプ

setsebool -P httpd_anon_write on

これにより、(P)永続的にSELinuxブール値httpd_anon_writeがtrueに設定され、すべてのコンテキストが吹き替えられpublic_content_rw_t、独自の場所にファイルを書き込む権限が与えられます。

ここで、プロジェクトディレクトリがSELinuxであると言わなければpublic_content_rw_tなりません。そうしないと、ファイルを書き込めなくなります。タイプ :

semanage fcontext --add --type public_content_rw_t "/project(/.*)?"

そして、 selinuxに上記の仕様を適用するようrestorecon -RvF /projectに指示します。

これで、ディレクトリはpublic_content_rw_tになり、ファイルを書き込めるようになります。

于 2017-01-14T02:08:16.307 に答える
0

私もこの問題に遭遇しました。私の場合、ディレクトリの所有権が間違っていることがわかりました。通常のApacheインストールの場合、ディレクトリはroot:rootではなくwww-data:www-dataが所有する必要があります。

于 2017-08-13T02:12:34.957 に答える
0

同様の質問を持つ人々のために、他に試すべきことがあります。ファイルのアクセス許可をいじる必要のない単純な間違いを犯しているだけかもしれません。この間違いを犯している場合は、ファイルのアクセス許可を修正しても効果がない可能性があります。

file_put_contents()でローカルの相対ファイルパスを使用していることを確認してください。

たとえば、次を使用します。

file_put_contents('short_local_path/my_working_file.txt', $myString);

いいえ:

file_put_contents('http://example.com/remote_path/my_working_file.txt', $myString);

そしてそうではありません:

file_put_contents('/whole/root/file/path/to/my_working_file.txt', $myString);
于 2020-04-05T04:10:51.987 に答える
-3

ディレクトリをchmoddingしてみました777か?

これを試して:

if(file_put_contents('file.txt', 'text')){
    die('yes');
} else {
    die('no');
}

スペルミスの可能性があります。^

于 2013-02-15T20:12:30.247 に答える