2010-08-27 46 views
0

實際上我試圖通過.htaccess內的查閱者。我想要做的是將引用值發送到一個PHP腳本中,這個值將被保存到數據庫中。在某些情況下(取決於引用者)圖像應被阻擋(熱鏈接),在其他情況下,圖像應正常顯示。但它不會:-(工作我目前的「嘗試」的模樣以下(這是隻是爲了測試,所以目前每個圖像將被處理):用mod_rewrite保存HTTP_REFERER?

RewriteCond %{REQUEST_URI} (.*)jpg$ 
RewriteCond %{ENV:verified} ^$ 
RewriteRule (.*)jpg$ /include/referrer.php?ref=%{REQUEST_FILENAME}&uri=%{REQUEST_URI}&query=%{QUERY_STRING}&env=%{ENV:verified} [E=verified:yes] 

RewriteCond %{REQUEST_URI} (.*)jpg$ 
RewriteCond %{ENV:verified} ^yes$ 
RewriteRule ^(.*)$ %{REQUEST_FILENAME} [E=verified:no] 

的referrer.php樣子:

<? 
log_img($_REQUEST['uri'].' - "'.$_REQUEST['env'].'"'); 
?> 

的問題是,referrer.php被稱作但圖像也不會被顯示出來,因爲沒有達到第二條規則是顯而易見的。

我也試圖顯示引薦內的圖像。 PHP,如:

<? 
log_img($_REQUEST['uri'].' - "'.$_REQUEST['env'].'"'); 
$src = str_replace($_SERVER['DOCUMENT_ROOT'],'',$_REQUEST['ref']); 
?> 
<img src="<? echo $src ?>" /> 

但是,然後再次調用.htaccess,我會遇到無限循環。

現在的問題是:我如何訪問第二條規則,或者如何實現我想要做的事情。有沒有辦法做到這一點?

感謝您的幫助, 拉爾斯

+0

確實沒有人有一個想法??? – Lars 2010-09-01 11:26:35

回答

0

您當前的解決方案不起作用,因爲mod_rewrite只能用於重寫請求到一個目的地,但你似乎想繞道而行請求您PHP腳本,然後繼續向圖像。可能會導致子請求導致PHP腳本被觸發,但我認爲不可能控制原始請求是否繼續到該場景中的圖像。

這裏最好的行動當然是讓你的PHP文件打印出你想要它做的實際圖像數據(而不是圖像標記引用的圖像),它的任何檢查/登錄後。只要您發送正確的標題,您可以使用readfile()做到這一點。確保後該文件是要滿足了(而不是一些任意的系統...上的文件)的圖像之一,你至少需要determine the appropriate content type,然後打印出數據。考慮高速緩存(參見this answer以及this one)也是一個好主意。

結合一些提及的技術,引薦腳本的一個簡單的僞例子將如下所示。請注意,您應該研究來實現所描述的技術的最佳途徑,你需要特別注意安全,因爲你打開文件和打印他們的內容。

$filename = /* sanitized file name */; 

log_img(/* log some data about the request */); 

if (file_exists($filename) && allowedToView($filename)) { 
    // Assume we're not on PHP 5.3... 
    $types = array(
     'gif' => 'image/gif', 
     'png' => 'image/png', 
     'jpg' => 'image/jpg', 
    ); 
    $parts = pathinfo($filename); 
    $ext = strtolower($parts['extension']); 

    if (array_key_exists($ext, $types)) { 
     $mime = $types[$ext]; 
     $size = filesize($filename); 
     $expires = 60 * 60 * 24 * 30; 

     if (!empty($_SERVER['IF-MODIFIED-SINCE'])) { 
      $modified = filemtime($filename); 
      $cached = strtotime($_SERVER['IF-MODIFIED-SINCE']); 

      if ($modified <= $cached) { 
       header('HTTP/1.1 304 Not Modified'); 
       exit(); 
      } 
     } 

     header("Content-Type: $mime"); 
     header("Content-Length: $size"); 
     header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) 
      . ' GMT'); 
     header('Cache-control: private, max-age=' . $expires); 
     readfile($filename); 
     exit(); 
    } 
} 

header("HTTP/1.0 404 Not Found"); 
exit(); 

並儘可能.htaccess文件去,它也只是像這樣(您添加到查詢字符串的東西在$_SERVER可無論如何,所以我看不出一點在手動將它傳遞給腳本):

RewriteEngine on 

RewriteRule \.(jpg|png|gif)$ /include/referrer.php [NC] 
相關問題