2011-09-20 34 views
0

工作我想在代碼點火器框架內使用xsendfile向用戶發送文件。xsendfile只能從索引

它都安裝正確,我的問題是,它似乎只能從路由工作,即使每個頁面都來自index.php無論如何。

這是我的函數:

function _output_file($name, $root_location, $public_location = FALSE) 
{ 
    if (function_exists('apache_get_modules') && in_array('mod_xsendfile', apache_get_modules())) { 
     header ('Content-Description: File Transfer'); 
     header ('Content-Type: application/octet-stream'); 
     if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE") != FALSE) { 
      header ('Content-Disposition: attachment; filename='.urlencode($name)); 
     } else { 
      header ('Content-Disposition: attachment; filename="'.$name.'"'); 
     } 
     //86400 is one day 
     header ('Expires: '.gmdate('D, d M Y H:i:s', (TIME_NOW + 86400))); 
     header ('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header ('Pragma: public'); 
     header ('X-Sendfile: '.$root_location); 
     exit; 
    } else { 
     redirect(site_url($public_location)); 
    } 
} 

如果我把這個在我的index.php頂部並加載它正常工作的根本,但如果我嘗試從domain.com/controller/訪問函數它返回一個404錯誤。

肯定使用index.php文件,因爲如果我用die(「test」)替換函數調用;這顯示在屏幕上。

我相信這是關於什麼權限xsendfile必須訪問該文件,但由於它是從根index.php工作,我會認爲它會有完整的權限,大概是基於請求的網址是什麼,我覺得很奇怪。

所以....有沒有人有任何建議,我怎麼能得到xsendfile工作通過codeigniter,從一個url,如「domain.com/files/get/12」?

回答

-1

看來這答案從來沒有一個效應初探,在最後,我剛剛在我的根目錄下創建了一個名爲「getfile.php」的文件,雖然不完美,但它現在完成了這項工作,對於任何可能發現它有用的人來說都是如此。

<?php 
define('BASEPATH', 'just done to stop direct access being disallowed'); 

function show_getfile_error() 
{ 
    echo 'You do not have permission to download this file, if you think this is a mistake please get in contact.'; 
    exit; 
} 

include('applications/config/database.php'); 
$mysqli = new mysqli($db['default']['hostname'], $db['default']['username'], $db['default']['password'], $db['default']['database']); 
if(!preg_match('%^[0-9]+$%', $_GET['key'])) 
{ 
    show_getfile_error(); 
} 
else 
{ 
    $query = mysqli_query($mysqli, 'SELECT * FROM getfiles WHERE getfile_key = '.(int)$_GET['key']); 

    $result = mysqli_fetch_array($query, MYSQLI_ASSOC); 

    if(!$result || $result['getfile_ip'] != $_SERVER['REMOTE_ADDR']) 
    { 
     show_getfile_error(); 
    } 

    header ('Content-Description: File Transfer'); 
    header ('Content-Type: application/octet-stream'); 
    if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE") != FALSE) { 
     header ('Content-Disposition: attachment; filename='.urlencode($result['getfile_name'])); 
    } else { 
     header ('Content-Disposition: attachment; filename="'.$result['getfile_name'].'"'); 
    } 
    //86400 is one day 
    header ('Expires: '.gmdate('D, d M Y H:i:s', (TIME_NOW + 86400))); 
    header ('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header ('Pragma: public'); 
    header ('X-Sendfile: '.$result['getfile_location']); 
} 
?> 
-1

使用下劃線前綴方法名稱使其無法通過URL訪問。

從文檔:

Private Functions

在某些情況下,你可能想從公共訪問隱藏的某些功能。要使某個功能成爲專用,只需添加一個下劃線作爲名稱前綴,並且不會通過URL請求提供。例如,如果你有這樣的功能:

private function _utility() 
{ 
    // some code 
} 

試圖通過URL來訪問它,像這樣,將不工作:example.com/index.php/blog/_utility/

+0

我的確意識到這一點,這是一個被稱爲例如另一個函數我在名爲「files」的類中有一個名爲「get」的函數,通過訪問domain.com/files/get然後調用這個函數。對不起,我應該提到的是,我認爲當你說這會從'index.php'通過我想這是一個問題,訪問的URL工作,但不能從控制器這將是顯而易見的 – robjbrain

+0

。你可不可以請刪除downvote? – birderic

+0

你好我的投票被鎖定,除非答案編輯:)(編輯:這不是我小氣,那是錯誤,以便使) – robjbrain

-1

今天我遇到了404錯誤。如果您傳遞給標題的路徑包含位於index.php所在的根文件夾之外的任何組件,那麼您將獲得404。確保路徑爲相對爲index.php,而不是絕對路徑。

+0

這是不正確的。 xsendfile要求所有傳遞給它的路徑都是絕對系統路徑。然後,xsendfile將通過apache直接處理文件。 –

+0

沒有。我對該站點有'base_dir'限制,並且'mod_xsendfile'將返回一個404,如果它提供的路徑的* any *部分位於受限根文件夾之外。它* did *但是使用'cwd'的相對路徑,默認情況下它是包含應用程序的index.php入口點的目錄。絕對路徑可能適用於某些系統設置,但安裝允許Web用戶在服務器上讀取訪問權限的任何路徑進行流式處理的插件看起來有點不必要的安全風險。 – Jason

0

XSendFile有一些特定的與安全相關的路徑怪癖......並且根據您的服務器配置,即使HTTP似乎正常工作,這些問題有時也可能通過HTTPS發生。

如果您在使用mod_xsendfile時遇到神祕的404s,並且您可以確認所提供的文件確實存在,那麼您可能需要在Apache confs中配置XSendFilePath

將以下內容添加到相應的conf(httpd.conf,ssl.conf,httpd-ssl.conf等)和/或在相應的VirtualHost聲明(如果使用虛擬主機)內部......

XSendFilePath /Absolute/Path/To/Your/Working/Directory/ 

注:無法這個添加到.htaccess文件。它必須放入一個Apache的conf。

一般來說,xsendfile會嘗試自動找出工作目錄,但有時不能。該指令明確告訴它應該通過xsendfile訪問什麼目錄(或導向器)。機會是神祕的404意味着你的目錄由於某種原因沒有通過白名單檢查。這將解決這個問題。

而且不要忘記,你更改配置後重新啓動Apache的。