2011-06-24 63 views
1

我有一個相當複雜的內容管理系統,我用PHP編寫,它有無限的分層類別。htaccess:重寫無限子目錄

每個類別有我與mod_rewrite的使用,以產生乾淨URL的短名稱(從類別標題動態生成的),例如

http://www.mysite.com/categories/january

這種方法的問題是,每個類別需要唯一它的正式工作的簡稱。當我有多個具有相同名稱的類別時,這會產生一個問題,並帶有不同的類別,例如, /類別/ 2011/1月和/類別/ 2010/1月。

解決這個問題的最簡單方法是在創建重複短名稱時追加-1,-2等,但我更願意在URL中使用整個類別層次結構並根據此確定正確的Ids,例如

http://www.mysite.com/categories/2011/january VS http://www.mysite.com/categories/2010/january

我的問題是:有沒有我可以使用mod_rewrite來解析任意數量的子類別,而這些回到我的PHP頁面,也許值數組的方法嗎?

無論子類別的數量如何,它都需要工作,因此它可以處理

http://www.mysite.com/categories/products/sheds/reports/2011/january

具有相同的代碼,並給我的PHP頁面它們在URL中規定的順序這些類別的陣列?

然後,我的代碼需要從最後一個類別開始向後工作,根據它的父母找出需要哪個類別。

這是什麼,這將是可行的(實際上推薦),任何人都可以給我一個手生產用於重寫命令正確的正則表達式,因爲我正則表達式的漂亮無望的把握?

很多感謝 尼克

回答

3

我不認爲有什麼簡單的方法來讓mod_rewrite的分割數據爲您服務。當然,您可以構建一個匹配9條虛擬路徑的RewriteRule,但我認爲這不會有幫助。相反,我建議這樣定義

RewriteRule ^categories/(.*)$ category-handler.php?cat=$1 

的規則,然後執行分裂(和重新排序)在PHP文件,像這樣

$cat = $_GET['cat']; 
$splittedCat = array_reverse(preg_split('/\//', $cat)); 
+0

這應該是足夠的(沒有必要昂貴的'preg_ *'函數):'$ splittedCat = explode('/',$ cat);'。但在整體 - 我不同意,這樣的路由好得多在PHP實現,因爲Apache的mod_rewrite最有可能將無法很好地實現這一點(一個可能的方法是太循環吧'[N]'...但它不夠安全/足夠靈活 - 需要很多真實示例測試)。我知道肯定 - 這可以通過使用'赫利的ISAPI_Rewrite 3'(其中模仿的mod_rewrite)我做到了我自己(它具有循環的特殊標誌)來完成..但它要在Windows上使用IIS。 +1 – LazyOne

+0

感謝jCoder - 出於某種原因,傳遞整個類別字符串在PHP中進行拆分的簡單原則完全逃脫了我!這應該是一個很好的解決方案。 – Nick