2013-02-15 27 views
7

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

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

私はつまり、私はそれを実行し、オフラインモードでそれを作成することができますbecaus私のファイルの場所が働くことを知って、テキストファイルを作成し、作成しようとするために、このラインを使用していますそれをコンソールで実行します。問題は、私が書き込もうとしている変数がHTTP Postを介して入力されていることです。ブラウザを使用してスクリプトを実行するとき、またはApacheがスクリプトを実行するときにファイルを書き込んだり作成したりしません。このスクリプトにこのテキストファイルを書き込ませるためには、構文を書く/変更するためのアクセスを許可するためには何が必要ですか?

+1

あなたのapacheユーザーにはディレクトリ権限が必要です - コマンドラインからapacheユーザーとしてスクリプトを実行しようとしましたが、それが動作するかどうかを確認してください – user1914292

+2

Apacheのエラーログを確認してください。 –

+0

$ myStringの値は何ですか?あれは正しいですか ? – Cooper

答えて

9

あなたの問題は、指定したファイルの場所に書き込む権限を持っていないためです。そのディレクトリに移動し、lsコマンドでパーミッションとグループ所有権を確認してください。

cd "My working file location" 
ls -l . 

ディレクトリのパーミッション、所有者、およびグループを表示する出力の3つの列があります。ほとんどの場合、rootによって所有されており、apacheがディレクトリに書き込む権限がありません。

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

tail -f /var/log/apache2/error.log 
+0

私はこの問題を解決しました。 selinuxのアクセス許可とApacheのアクセス権。 – choppyfireballs

+2

あなたの答えを分かち合うことができます。 Googleは私をここにリダイレクトして、私はまだブロックされています。 –

+1

@VenderAeloth choppyfireballsはここではあまり活発ではないようですが、彼が応答しない場合は、見つけたときに私たちと答えを共有してください! –

-2

あなたは777にディレクトリをchmodding試したことがありますか?

これを試してみてください:スペルミス何かの

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

可能性があります。^

+1

時にはこれは何が間違っているかを見る良い方法です。 – tofutim

1

私は最近同じ問題を抱え、この質問に遭遇しました。残念なことにchoppyfireballs OPは彼が自分の解決策を見つけたコメントにコメントし、ちょうど私たちを助けていない答えを受け入れました...そして、検索と成功の後にfile_put_contentsを再び働かせることにしました。私のファイルやディレクトリの

権限は(自分のディレクトリは、この場所にファイルを書き込むためにrootと他人助成金を与えるchmod 757あることを確認してください)すべての書き込みを受け入れるには、[OK]しました。システムがおそらくSELinux(Security Enhanced Linux)システムなので、それが私のためではないように動作しない場合は、それが原因です。

setenforce 0を書くと、selinuxが許可モードになります。スクリプトが再度実行され、問題が十分に説明されている場合は、再度実行してください。

その場合は、にselinuxを入れて、プロジェクトのディレクトリがあるディレクトリにls -Zlを入れてみてください。あなたはこの1つ1つのディレクトリからのコンテキストを転送するchconを使用した場合、これはあなたに

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

または別の何かが、httpd_sys_content_tのような行を与えるだろう。 httpd_sys_content_tがない場合は、そのディレクトリのコンテキストを変更する必要があるため、大丈夫です。

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

setsebool -P httpd_anon_write on 

これは、(P)ermanently SELinuxの真のブールhttpd_anon_writeと、自分の場所に任意のファイルを書き込む権限を持っていますpublic_content_rw_tとして吹き替え任意のコンテキストを設定します。

今度は、あなたのプロジェクトディレクトリがpublic_content_rw_tであることをSELinuxに伝える必要がありますが、それでもファイルを書き込むことはできません。タイプ:

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

restorecon -RvF /project上記の仕様を適用するSELinuxのを指示します。

あなたのディレクトリはpublic_content_rw_tであり、ファイルを書き込むことができるはずです。私もこの問題に遭遇した

cd /mydir/ 
setsebool -P allow_httpd_anon_write true 

敬具

-1

は必ず注意してください。私の場合、ディレクトリの所有権が間違っていることがわかりました。典型的なApacheのインストールの場合、ディレクトリはroot:rootではなくwww-data:www-dataによって所有されている必要があります。

0

:私の解決策は本当に明確であるが、それは働いていた場合私は

+0

これは質問に対する答えを提供しません。一度あなたは十分な[評判](https:// stackoverflow。com/help/whats-reputation)あなたは[投稿にコメントする]ことができます(https://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューから](/レビュー/低品質の投稿/ 17017422) –

関連する問題