簡體   English   中英

在PHP中,如何確保將目錄作為Web上的公共讀取訪問?

[英]Within PHP, how can I make sure a directory as public read access from the web?

我有一堆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。”

可以從網絡訪問是一回事,並且“公共讀取訪問”是另一回事。 你不需要一個人做另一個。

通常,“公共讀取訪問”表示特定於操作系統的文件系統權限。 可從網絡訪問意味着:

  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有提示。

也許這個使用“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";
?>

干杯,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM