我做了一个实验:
我手动创建了具有所有权限的新目录结构/ r / reuse / data,然后尝试使用https://www.nsrusa.org/Tests/test.php在数据中写入文件。
<?php
// Test writing into new file outside of document root
error_reporting ( E_ALL);
ini_set ( "display_errors", "on");
file_put_contents ( "/r/reuse/data/test.txt", "hello world!");
?>
我收到此错误消息:
"Warning: file_put_contents(/r/reuse/data/test.txt): failed to open stream: No such file or directory in /home/nsr/public_html/Tests/test.php on line 6"
为什么会这样?
添加10/15/18:
我添加了代码来检查每个父目录是否存在,唯一发现的目录是/。因此,即使我以用户“ root”运行时创建了/ r,也未找到/ r!这是否意味着尽管对目录具有r和x权限,但以用户'nsr'身份运行的程序看不到创建为'root'的目录?我不明白。
已添加:
我将/ r / reuse / data目录的所有者和组更改为nsr,但在以“ nsr”用户身份运行测试程序时仍得到相同的结果。
答案 0 :(得分:0)
(原始海报提供的答案)
当WHM“ mod_ruid2 and jailshell” Tweak开启时,导致无法写入服务器上所有网站的文档根目录之外的目录和文件。感谢WHM / cPanel支持,我现在了解了原因。
首先,我要说的是,我想能够写入这样一个目录的原因是,我有兴趣向多个不相关的网站(甚至是由不同公司拥有)提供一个通用的软件组件,服务和存储库)由同一位网站设计者编写,并存在于同一台服务器上。
为此,理想地,我需要创建一个“ root”拥有的公共目录,以提高效率,所有网站都可以引用该目录直接进行读写(通过使用诸如PHP的服务器端语言)。该目录显然必须存在于所有网站的文档根目录之外,因为它将包含每个网站使用的通用软件库。
我已经使用现有的机制(例如PHP的include_path和Apache的别名)完成了阅读部分,这很不错,但是当WHM“ mod_ruid2 and jailshell” Tweak处于打开状态时,书写是一个问题。该Tweak与Linux一起使用类似于“ chroot”的命令来创建“只读”安装的虚拟文件系统,该命令限制了对文件系统的访问,因此不会在用户文档根目录之外进行写入。即使父目录被授予drwxrwxrwx权限,也禁止写入。在裸露的Linux下,该权限允许服务器上的任何用户(任何虚拟主机)进行写入。
我希望这些信息对那些因PHP或其他服务器端I / O无法写入文档根目录之外的目录而感到困惑的人有所帮助。 WHM的“ mod_ruid2 and jailshell”调整禁止在没有例外情况下进行写访问。