在PHP中,如何确保目录是web上的公共读取访问?

在PHP中,如何确保目录是web上的公共读取访问?,php,Php,我有一堆JavaScript文件,我想缩小这些文件,然后将其缓存到一个文件中。此文件保存到我作为参数提供的位置 如何确保该位置可以从web访问 到目前为止,我所尝试的: $test = array ( '/Users/www/htdocs/test/nhecos/cache/test.js', '/Users/www/foo.js' ); $host = 'http://localhost/'; foreach($test as $t) { $url = str_rep

我有一堆JavaScript文件,我想缩小这些文件,然后将其缓存到一个文件中。此文件保存到我作为参数提供的位置

如何确保该位置可以从web访问

到目前为止,我所尝试的:

$test = array
(
    '/Users/www/htdocs/test/nhecos/cache/test.js',
    '/Users/www/foo.js'
);
$host = 'http://localhost/';

foreach($test as $t) {
    $url = str_replace($_SERVER['DOCUMENT_ROOT'], $host, $t, $count);
    $perms = substr(sprintf('%o', fileperms($t)), -4);
    $p = substr($perms, -1);

    if ($count > 0 && $p >= 4) 
        print $url;
    else 
        throw new \Exception(sprintf("File %s not accessible from Web!", $t));
}
这在大多数情况下都有效,但如果该文件位于虚拟主机目录或链接文件夹中,则会失败。还有更好的办法吗

注意:我的问题是确保

“我生成的文件位于web已知的位置 服务器,并映射到URL。“


从网络上访问是一回事,拥有“公共阅读访问”是另一回事。你不需要一个来做另一个

通常,“公共读取访问”是指特定于操作系统的文件系统权限。可从web访问意味着:

  • 它位于web服务器已知的目录中,也就是说,文件系统位置由web服务器映射到URL

  • 文件(和封闭目录)的权限使得web服务器进程可以读取文件(对于静态文件),并可以执行文件(对于从与web服务器以相同用户身份运行的处理程序中运行的脚本)

  • 因此,在您的情况下,您需要确保:

  • 脚本以与web服务器相同的用户身份运行-通常是这样,但在某些情况下,脚本可能以不同的系统用户身份运行

  • 您生成的文件位于web服务器已知的位置,并且映射到URL

  • 最后,您生成的文件的权限(特别是当执行脚本的用户与web服务器进程不同时)具有基于系统布局的正确权限

  • 在大多数类unix系统上,web服务器以
    www
    apache
    运行。在debian的its
    www-data

    通常,静态文件需要八进制权限
    644
    ,即
    rw
    的所有者,其余的仅用于读取。在
    ls-l
    列表中,如果目录不属于服务器进程,则这是文件的
    -rw-r--


    对于访问权限的疑难解答,有一些提示。

    也许使用“可读性”进行简单检查会有所帮助,以下只是一个示例:

    <?php
        if (is_readable('../../../www')) echo "www is readable"; 
            else echo "www is unaccessible";
        echo '<br/>';
        if (is_readable('../../htdocs')) echo "htdocs is readable"; 
            else echo "htdocs is unaccessible";
    ?>
    
    
    
    更新以能够使用指定的URL检查文件(使用文件内容或从PHP复制函数/方法):

    
    

    干杯,

    是的,我的措辞可能不是最好的。但我如何保证第2点?->“您生成的文件…”(因为第1点很少见,第3点已经得到处理)理想情况下,它应该是文档根目录下的任何目录;这在文件系统级别很容易做到。但是,URL可能与文件系统层次结构不匹配。问题在于这样一种情况,即文件实际上可以从web访问,但不在文档根目录下。例如,我的WebDav目录是htdocs目录的同级目录。您需要在运行时通过提示用户输入目标文件系统路径来确定它的值。通常,您只确保缓存文件夹的“父级”是可写的,并且不向web公开缓存文件夹。最好的方法是将其集成到安装程序脚本中,这样它就可以满足这一要求和其他飞行前的要求。好吧,这并不能确保仅“Apache用户”可以从web访问该文件。Apache(和PHP)可以虚拟地读取任何文件夹或文件,只要它的用户对它有权限。你说得对,很抱歉。使用php函数“file\u get\u contents('此处的url')”怎么样。如果返回false,则表示无法访问url中指定的文件。还有另一种选择是使用PHP函数“copy('url source','url destination')”。但是,使用这个“复制”函数需要指定一个目标文件(可能只是一个伪文件)。我更新了上面的示例。最好的是:)这只有在启用的情况下才有效。脚本必须“猜测”url。如果失败,可能是因为文件夹不是web公共的,也可能是因为脚本猜错了。
    <?php
        if (@copy('http://.../file.js', 'dummy.file')) echo "file is readable"; 
            else echo "file is unaccessible";
        echo '<br/>';
        if (@file_get_contents('http://.../file.js'))  echo "file is readable"; 
            else echo "file is unaccessible";
    ?>