2013-02-08 77 views
0

我對mod_rewrite感到可怕,甚至不確定它是否是我最好的方法。使用htaccess將目錄/文件夾拆分成小目錄mod_rewrite

我有一個/圖像目錄中有20,000個左右的圖像。我的網絡主機說他們會停用我的帳戶,除非我得到每個目錄下的2500個文件。

所以我想改變它,這樣/images/apple.jpg重定向到/images/a/apple.jpg,並/images/banana.jpg重定向到/images/b/banana.jpg這樣,每當一個PHP文件調用/images/apple.jpg會重定向。相反,任何新創建的圖像都需要放在正確的目錄中。

我想代碼PHP來做到這一點,但我的圖像目錄被引用736個文件。

如果有人有更好的想法 - 我願意接受。

回答

0

重定向到新目錄的.htaccess似乎並不是最好的想法,因爲此時需要至少8個不同的目錄(和8個不同的重寫規則)才能將20000個文件分割成最多包含2500個文件的目錄。所以,明天將需要9個目錄,而不是提及使用重寫規則來選擇轉到每個目錄的文件可能變得非常困難。

我想最好的選擇是在PHP腳本中處理該路由,使用數組或任何需要的路由。

你可以重定向轉到/images目錄PHP腳本中的根,例如,這反過來又重定向到相應的目錄根據傳遞給腳本

像這樣的參數的一切:

Options +FollowSymlinks 
RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_URI} !handler.php 
RewriteCond %{REQUEST_URI} ^/images/([^\.]+)\.([\w]+)/? [NC] 
RewriteRule .* handler.php?name=%1&ext=%2 [L] 

地圖默默:

http://example.com/images/filename.ext帶或不帶斜線。

要:

http://example.com/handler.php?name=filename&type=ext

只傳遞一個參數到腳本,而不是或名稱和擴展,只需更換這一個重寫規則:

RewriteRule .* handler.php?%1.%2 [L] 

這是隻是一個例子。腳本handler可以具有任何名稱,如果使用的話,則可以使用密鑰nametype

必須保留傳入的URL結構才能使規則集工作:URL內的最後一個字符串必須是該文件。

對於永久和可見重定向,請將[L]替換爲[R=301,L]

+0

這是有道理的,我看到這可以工作 - 我可以試試這個。我只關心效率問題,因爲處理程序可能會在單個頁面載入中被調用數百次。不過,我還是看到了能夠在處理程序文件中輕鬆更改規則的價值。 謝謝! – dragon1234

+0

@Peter PHP通常比mod_rewrite規則更快,但在這種情況下,一堆規則太多而無法檢查,所以對性能的影響應該更小,我猜。 –

+0

你好@faa, 感謝您的全力幫助。 我該如何處理handler.php?我嘗試了回聲和回報,並沒有真正的運氣。 ' ' – dragon1234