在PHP中,如何确保将目录作为Web上的公共读取访问?

时间:2012-10-14 03:46:15

标签: php

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

如何确保可以从网络访问该位置?

到目前为止我尝试过:

$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));
}

这大部分时间都有效,但是例如,如果该文件位于虚拟主机目录或链接文件夹中,则会失败。有没有更好的方法?

注意:我的问题是确保

  

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

2 个答案:

答案 0 :(得分:2)

可以从网络访问是一回事,拥有“公共读取权限”是另一回事。你不需要一个人去做另一个。

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

  1. 它位于Web服务器已知的目录中 - 也就是说,Web服务器将文件系统位置映射到URL。

  2. 文件(和封闭目录)的权限使得Web服务器进程可以读取文件(对于静态文件),并且可以执行文件(对于从作为运行的处理程序运行的脚本)与Web服务器相同的用户。)

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

    1. 该脚本作为与Web服务器相同的用户运行 - 通常就是这种情况,但在某些情况下,您的脚本可能以不同的系统用户身份运行。

    2. 生成的文件位于Web服务器已知的位置,并映射到URL。

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

    4. 在大多数类Unix系统上,Web服务器以wwwapache运行。关于debian的www-data

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

      为了解决访问权限问题,apache wiki有提示。

答案 1 :(得分:0)

也许这个使用“is_readable”的简单检查可以提供帮助,下面这只是一个例子:

<?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检查文件(使用file_get_contents或从PHP复制函数/方法):

<?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";
?>

干杯,