0

我有一堆 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));
}

这在大多数情况下都有效,但如果该文件位于虚拟主机目录或链接文件夹中,则会失败。有没有更好的办法?

注意:我的问题是确保

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

4

2 回答 2

2

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

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

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

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

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

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

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

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

在大多数类 unix 系统上,Web 服务器运行为wwwapache. 在 debian 上它的www-data.

一般来说,静态文件需要八进制权限644,即拥有者rw,其余的只能读取。在ls -l列表中,-rw-r--r--如果目录不属于服务器进程,则这是针对文件的。

对于访问权限的故障排除,apache wiki有提示。

于 2012-10-14T03:55:25.783 回答
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";
?>

干杯,

于 2012-10-14T04:05:36.840 回答