2015-10-08 39 views
0

我從來沒有遇到過PHP能夠在組和用戶設置正確時讀取文件的問題。即使使用777權限和文件+目錄中的正確組,PHP要求權限也被拒絕

Apache正在www-data用戶下運行,所以我用777 chmod將所有的一切(組和用戶權限)設置爲www-data,但仍然沒有任何工作。

不知道發生了什麼事。

PHP未進入安全模式。

代碼:

require ('/root/app/class/api.php'); 

文件系統:

$ pwd 
/root/app/class 
$ ls -la 
total 76 
drwxrwxrwx 2 www-data www-data 4096 Oct 8 10:59 . 
drwxrwxrwx 9 www-data www-data 4096 Sep 25 21:25 .. 
-rw-r--r-- 1 root  root  26896 Jan 13 2014 something_else.php 
-rw-rw-r-- 1 root  root  32807 Mar 11 2015 something.php 
-rwxrwxrwx 1 www-data www-data 3439 Mar 3 2015 api.php 

錯誤:

Warning: require(/root/app/class/api.php): failed to open stream: Permission denied in /var/www/website.com/htdocs/app_frontend/include/config.php on line 36 

Fatal error: require(): Failed opening required '/root/app/class/api.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/website.com/htdocs/app_frontend/include/config.php on line 36 

試圖調試:

error_reporting(E_ALL); 
ini_set('display_errors','On'); 

$file = '/root/app/class/api.php'; 

echo sprintf ('%o', fileperms ($file)), PHP_EOL; 
echo posix_getpwuid (fileowner ($file)), PHP_EOL; // Get Owner 
echo posix_getpwuid (posix_getuid()), PHP_EOL; // Get User 

if (is_file ($file)) { 
    echo "is_file", PHP_EOL; 
    ; 
} 

if (is_readable ($file)) { 
    echo "is_readable", PHP_EOL; 
    ; 
} 

if (is_writable ($file)) { 
    echo "is_readable", PHP_EOL; 
} 

fopen ($file, "w"); 

結果:

Warning: fileperms(): stat failed for /root/app/class/api.php in /var/www/website.com/... 

Warning: fileowner(): stat failed for /root/app/class/api.php in /var/www/website.com/... 

編輯:有我的服務器上沒有啓用SELinux的,這裏的apachectl的輸出DUMP_MODULES

$ /usr/sbin/apachectl -t -D DUMP_MODULES 
Loaded Modules: 
core_module (static) 
so_module (static) 
watchdog_module (static) 
http_module (static) 
log_config_module (static) 
logio_module (static) 
version_module (static) 
unixd_module (static) 
access_compat_module (shared) 
alias_module (shared) 
auth_basic_module (shared) 
authn_core_module (shared) 
authn_file_module (shared) 
authz_core_module (shared) 
authz_host_module (shared) 
authz_user_module (shared) 
autoindex_module (shared) 
deflate_module (shared) 
dir_module (shared) 
env_module (shared) 
filter_module (shared) 
mime_module (shared) 
mpm_prefork_module (shared) 
negotiation_module (shared) 
php5_module (shared) 
rewrite_module (shared) 
setenvif_module (shared) 
status_module (shared) 

回答

3

整個路徑,文件應該以可讀爲PHP打開它。

例如:

# cd/
# ls -al 
drwx------ 3 root wheel 102 jan 1 2014 root 
# sudo su 
Password: 
$ cd /root 
$ mkdir pub 
$ chmod 777 pub 
$ vi pub/test.php 

<?php 
echo "Hi, world!"; 
:wq 

$ chmod 666 pub/test.php 
$ php -a 
Interactive shell 

php > include "/root/pub/test.php"; 
Hi, world! 
php > exit 
$ exit 
# php -a 
Interactive shell 

php > include "/root/pub/test.php"; 
PHP Warning: include(/root/pub/test.php): failed to open stream: Permission denied in php shell code on line 1 
... 

注意,在這個例子中,是/root應該總是可讀,可寫和僅由根可執行

TL; DR: 將您的文件移出/root。確保您的文件的路徑整個可讀。

0

禁用SELinux並查看結果。如果是這種情況,只需安裝並運行一個名爲SELinux疑難解答程序。

  1. 尋找相關提示。
  2. 點擊排除故障
  3. 檢查任何列出的插件並在終端中執行建議的命令。