权限设置为777,文件仍然无法写入

Ric*_*nop 5 php apache mod-rewrite

我已将文件权限设置为777但我无法使用PHP写入该文件.

我可以在我的FTP客户端清楚地看到该文件具有0777权限,当我这样做时:

echo (true === is_writable('file.txt')) ? 'yes' : 'no';
Run Code Online (Sandbox Code Playgroud)

我得到'不';

我也尝试过:

echo (true === chmod('file.txt', 0777)) ? 'yes' : 'no';
Run Code Online (Sandbox Code Playgroud)

结果相同.

目录列表如下所示:

public_html
    public          0777
        css         0755
        js          0755
        file.txt    0777
Run Code Online (Sandbox Code Playgroud)

我正在使用.htaccess文件将所有流量重定向到公共子文件夹.当然,我已将文件排除在重写之外(可以从我检查的浏览器访问):

RewriteRule  ^(file).*  - [L]
Run Code Online (Sandbox Code Playgroud)

这是为什么?

And*_*ore 8

我猜Apache运行的是不同的用户/组,而不是拥有该文件的用户/组.在这种情况下,文件本身需要0777.

public只有0777在你计划使用PHP将文件添加到文件夹时才需要.即使文件夹本身不是0777,如果文件是,并且文件夹至少5有user(read/execute),您应该能够写入该文件.

最后,您的文件树应如下所示:

public_html
    public
        file.txt  0777
Run Code Online (Sandbox Code Playgroud)

当然,您将无法使用PHP更改这些权限,但您可以从FTP客户端执行此操作.

如果它仍然无法正常工作,PHP可能正在安全模式下运行,或者您可能正在使用PHP Suhosin等扩展.您可能会获得更好的结果,将文件的所有者更改为运行该脚本的同一用户/组.

要获取正在执行的用户的用户/组ID,您可以使用以下命令:

<?php
echo getmyuid().':'.getmygid(); //ex:. 0:0
?>
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用chown(在终端中)更改文件的所有者:

> chown 0:0 file.txt
Run Code Online (Sandbox Code Playgroud)

  • 我只是想补充说我已经设置了正确的所有者,我的文件仍然无法写入.原因是SELinux,如本答案http://stackoverflow.com/a/9819118/2522817中所述 (2认同)