2014-12-06 48 views
0

我希望我能清除我的問題。我有一個重寫規則。它工作正常,但如果我輸入點和文件擴展名,它會查找目錄。我想刪除它。基本上我想編輯我的網站上傳的圖像URL rewrite禁用打開文件

如果你不明白我的問題,我可以用例子更好地解釋它。

我有文件夾「/ uploads/images /」。然後我在裏面有圖像(例如test.jpg)。我的控制器通過打開第一個參數的類文件並使用第二個參數的名稱查找函數來工作。所以如果我嘗試打開

www.example.com/uploads/images 

它會嘗試打開class.uploads.php並運行名爲images的函數。我也有第三個參數 - $ _GET [「S」]我的階級是這樣的:

class uploads{ 
    public function images(){ 
     $img = Database::Map("s/string"); 
     $img = $img['s']; 
     die($img); 
    } 
} 

當用戶進入www.example.com/uploads/images/test.jpg我的功能我想執行並不打開文件。此外,我只想爲上傳文件夾制定此規則。

這是我的.htaccess重寫規則:

RewriteEngine on 
RewriteBase/
RewriteRule ^([^/\.]+)?/?([^/\.]+)?/?([^/\.]+)?/?([^/\.]+)?/?$ index.php?act=$1&p=$2&s=$3&ss=$4&%{QUERY_STRING} [L] 

這是我的前端控制器:

... 
$_GET["act"] = strtolower($_GET["act"]); 
$Page = new $_GET["act"]; 
if($_GET['p'] == NULL && $_GET['act'] != NULL)$_GET['p'] = "index"; 
if(method_exists($Page,$_GET["p"]) == false)$Core->GoPage("/NotFound/"); 
if(method_exists($Page,"PreRun") == true)$Page->PreRun(); 
if(isset($_GET["s"]) == false)$Page->{$_GET["p"]}(); 
if(isset($_GET["s"]) == true)$Page->{$_GET["p"]}($_GET["s"]); 
... 

回答

1

在您的上傳文件夾,創建一個文件.htaccess包含以下內容:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /class.uploads.php [L] 
</IfModule> 

在您的根目錄下創建一個名爲class.uploads.php的文件/,然後讓它調用你的函數images()。如果你需要這個規則,對只.jpg那麼我們可以改變重寫規則

$_SERVER['REQUEST_URI'] 

然後你就可以通過檢索請求在PHP中的文件名或目錄。否則,這將支持.png,.gif,甚至像/uploads/user1234/images/這樣的目錄。

+1

嘿,感謝您的快速回復。這將工作,但我已經有一個RewriteRule。我在我的問題中增加了更多細節。你能幫我整合它與我目前的規則嗎? – 2014-12-06 23:17:40

+0

這是一個有趣的重寫,目前在技術上有一個新問題。讓我想想。如果你在我看的時候創建一個新的問題,我只會看看那個問題。等等,你還需要修改PHP嗎?是的,我不確定如何融入當前的重寫規則,因爲編輯而接受並創建新問題? – Scott 2014-12-06 23:25:45

+1

我不介意,但我想創建一個新的問題,但只要我知道這是針對堆棧溢出規則。我被禁止了一次,我不想再被禁止。此外,我不希望PHP中有任何更改,我剛剛發佈了它來解釋我的控制器如何儘可能清晰地工作。 – 2014-12-07 00:48:05