こちらの環境は、Apache2.4, PHP5.4 です。
お名前.comで借りたVPSサーバを利用し、PHPを利用しサーバ内のmysqlを利用したrssリーダーを作成していました。
管理上、csvファイルにRSSフィードを保存し、web上のフォームよりPHPを利用して新規登録を行う仕組みを作っています。
そこで、apache上のPHPからfopen関数を利用し追記モードでファイルを開こうとしたのですが、失敗します。
/var/httpd/error_logにはpermission deniedと書いてありました。
当該ファイルまでの、ディレクトリの権限は以下です。
root:root 775 /
root:root 1715 /var
root:apache 1770 /var/www
root:apache 1770 /var/www/html
追記したいファイル(/var/www/html/test.csv)の権限は root:apache 1660となっています。
httpd.confファイルのUser/Group設定も apache/apacheとなっています。
また、<Directory></Directory>設定もRequire all grantedとなっております。(ルートディレクトリのみRequire all denied)
また、sshを用いてmacより当該のサーバにrootユーザでログインし、そちらでsu apacheとしてからphp opencsvTest.phpでphpを実行した場合は書き込みできます。
ソースコードと実行結果は以下でございます。
PHP
1#opencsvTest.php# 2<?php 3 ini_set('display_errors', 1); 4 // $usr = posix_getpwuid(posix_geteuid())['name']; 5 exec('whoami', $usr); 6 exec('groups', $grps); 7 $lgnusr = posix_getlogin(); 8 echo '実行ユーザ=' . implode(', ', $usr) . '<br>所属グループ=' . implode(', ', $grps) . "<br>login=" . $lgnusr; 9 $args = array('/var', '/var/www', '/var/www/html'); 10 echo '<br>書き込み権限チェック開始...<br><br>'; 11 12 foreach ($args as $value) { 13 if(is_writable($value)) { 14 echo "{$value}は書き込み出来ます。<br>"; 15 $fp = fopen("{$value}/test.csv", 'ab'); 16 $val = array('this', 'is', 'test', 'file'); 17 fputcsv($fp, $val); 18 fclose($fp); 19 } 20 else { 21 echo "{$value}は書き込みできません。<br>"; 22 } 23 } 24?>
実行結果1(ssh root@hoge.com → su apache → php opencsvTest.php)
実行ユーザ=apache<br>
所属グループ=apache<br>
login=root<br>
書き込み権限チェック開始...<br>
<br>
/varは書き込みできません。<br>
/var/wwwは書き込み出来ます。<br>
/var/www/htmlは書き込み出来ます。<br>
実行結果2(webブラウザよりhoge.com/opencsvTest.phpを実行した場合)
実行ユーザ=apache<br>
所属グループ=apache<br>
login=<br>
書き込み権限チェック開始...<br>
<br>
/varは書き込みできません。<br>
/var/wwwは書き込みできません。<br>
/var/www/htmlは書き込みできません。<br>
しばらくweb上を検索して調べてみましたが解決法が見つからないのでこちらで質問させて頂きます。
当該ファイルを追記モードで開く方法、もしくは上の仕様を満たす妥協案などございましたらご教授願います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。