PHP/Apache dba_open文件权限


PHP/Apache dba_open file permissions

我尝试在 php script(handler.php) 中不在 DocumentRoot(/var/www/api) 下的目录中打开一个 bdb 文件:

<?php
$db = dba_open("/data/bdb/current.dbm", "r", "db4");
...
?>

在 apache 日志中:

[Mon Feb 02 23:03:59 2015] [error] [client 54.149.49.76] PHP Warning:  dba_open(/data/bdb/current.dbm): failed to open stream: Permission denied in /var/www/api/handler.php on line 6
/

data/bdb/current.dbm 是指向/data/bdb/test.dbm 的符号链接

我确保目录、符号链接和文件权限都是 world +rw,但仍然收到权限错误。

我做了:"su - apache;php test.php",其中test.php包含dba_open调用,并且工作正常。它只是在httpd下不起作用。

我假设我需要在 apache conf 中设置一些指令才能使其工作,我只是不知道具体是什么。

创建一个新组 (www-pub) 并将用户添加到该组

组添加 www-pub

usermod -a -G www-pub usera ## 必须使用 -a 附加到现有组

usermod -a -G www-pub userb

组用户 ## 显示用户的组

将/var/www 下所有内容的所有权更改为 root:www-pub

chown -R root:www-pub/var/www ## -R for recursive

将所有文件夹的权限更改为 2775

chmod 2775/var/www ## 2=设置组ID,7=RWX表示所有者(根),7=RWX表示组(www-pub),5=rx表示世界(包括Apache www-data用户)

设置组 ID (SETGID) 位 (2) 会导致将组 (www-pub) 复制到在该文件夹中创建的所有新文件/文件夹。其他选项是SETUID(4)来复制用户ID,以及STICKY(1),我认为它只允许所有者删除文件。

有一个 -R 递归选项,但它不会区分文件和文件夹,所以你必须使用 find,如下所示:

查找/var/www -type d -exec chmod 2775 {} +

将所有文件更改为 0664

查找/var/www -type f -exec chmod 0664 {} +

将用户的掩码更改为 0002

umask 控制默认的文件创建权限,0002 表示文件将有 664 个,目录为 775。设置它(在我的情况下,通过编辑/etc/profile 底部的 umask 行)意味着一个用户创建的文件将被 www-group 中的其他用户写入,而无需对其进行 chmod。

通过创建文件和目录并使用 ls -l 验证所有者、组和权限来测试所有这些。

注意:您需要注销/登录才能使对组的更改生效!