在PHP中,如何确保目录是web上的公共读取访问?
我有一堆JavaScript文件,我想缩小这些文件,然后将其缓存到一个文件中。此文件保存到我作为参数提供的位置 如何确保该位置可以从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
$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访问意味着:
www
或apache
运行。在debian的itswww-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";
?>