function.fopen:无法打开流:PHP中的权限被拒绝

时间:2011-03-09 23:34:24

标签: php linux permissions file-permissions

我正在尝试从我的PHP应用程序为我的网站创建XML站点地图。我们的想法是创建一个新文件或覆盖现有文件。当我打电话给fopen时,我收到以下错误:

[function.fopen]: failed to open stream: Permission denied

我正在尝试写入webroot,其权限是:755。这意味着所有者拥有写入权限,对吧?我需要做什么才能使我的脚本能够写入此文件夹? 777会是一件坏事,对吗?我可以以某种方式运行我的脚本作为所有者吗?

感谢。

7 个答案:

答案 0 :(得分:5)

是的,正如你所说,使用777可能是一个巨大的错误。 Web服务器不会与您用于创建文件和文件夹的用户一起运行。

你有一些选择:

  • 使用具有写入权限的用户(除了apache用户之外),将站点地图创建作为cronjob运行。
  • 将站点地图放在另一个目录中,然后设置302 Redirect或符号链接。在这种情况下,如果您遇到安全问题让某人编写您的sitemap.xml,至少他们将无法创建具有更危险扩展名的其他文件(如PHP,这可能会导致网站入侵) )。
  • 制作重写规则,将任何匹配重定向到sitemap.xml,并输出到输出相应XML的php脚本。
祝你好运!

答案 1 :(得分:5)

我是初学者,我也有这个问题。我正在使用Ubuntu linux w / php和apache

  • 使用以下代码编写一个php脚本:<?php exec('whoami'); ?>并在您的服务器上运行它。这将告诉您脚本的当前用户是
  • SSH到您的服务器。
  • 创建一个对您需要的文件具有读写权限的组。
  • 让群组对您需要的文件夹进行读取,写入和执行。
  • 使您在第一步中找到的当前用户成为可以访问所需文件的组的一部分。
  • 重启Apache:sudo apachectl restart
  

您需要的主要命令是:

答案 2 :(得分:1)

如果您在webroot分区上启用了ACL,则只授予Web服务器用户名完整权限

setfacl -m u:apache:rwx /var/www/html

apache替换为Web服务器用户名,将/var/www/html替换为您的webroot位置。

答案 3 :(得分:1)

有同样的问题

看起来apache在nobody组

中以 nobody 的形式运行

所以如果你做了

useradd -G nobody youruser

chown -R youruser:nobody .

然后将权限更改为0775

chmod -R 0775 .

或者您可以向用户组添加任何人

useradd -G nobody yourgroup

这是一个更好的解决方案

答案 4 :(得分:0)

777很正常,因为PHP不会像你一样运行,它以PHP用户,Apache等运行。事实上,你的webhost应该拥有更高的权限集,阻止其他用户编写/删除你的文件

答案 5 :(得分:0)

是否可以启用组写(即775)? 检查您的组权限以查找该文件所在的目录。只要您的PHP用户(通常是www-data)属于该组,并且它是唯一的用户,您就可以使用775(甚至是774)。

答案 6 :(得分:0)

像帕斯卡尔说的那样! 找到你的apache用户

<?php exec'whoami'; ?>

然后

useradd -G username username2
chown -R username:username2 .
chmod -R 0775 .

它完成了! 谢谢Pascal!