即使使用777权限和正确的文件+目录组,PHP也要求权限被拒绝

时间:2015-10-08 15:47:33

标签: php apache permissions filesystems

当组和用户设置正确时,我从未遇到过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)

2 个答案:

答案 0 :(得分:3)

该文件的整个路径需要可读,以便PHP打开它。

例如:

stderr

请注意,在此示例中,# 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 ... ,并且应始终可读,可写且仅可由执行

<强> TL; DR: 将文件移出/root。确保文件的整个路径可读。

答案 1 :(得分:0)

禁用SELinux并查看结果。如果是这种情况,只需安装并运行名为SELinux故障排除程序的程序即可。

  1. 查找相关提醒。
  2. 点击疑难解答
  3. 检查列出的任何插件并在终端中执行建议的命令。