2010-01-13 30 views
0

我書面方式我自己的小框架,我要實現友好的URL那裏。 mod_rewrite很棒。但我希望能夠同時處理多種類型友好的URL:PHP:解析不同風格友好的URL的

/index.php?ac=user&an=showprofile (fallback variant, the worst) 
/index.php/user/showprofile (supposedly, can be disabled by security settings) 
index.php?user/showprofile (optional, not needed) 
/user/showprofile (ideal, but requires mod_rewrite or dirty ErrorDocument tricks) 

我想所有的變體,在一次支持,以便與任何方案產生的舊鏈接將永遠有效。我應該爲此編寫我自己的解析函數嗎?或者,我錯過了一些庫/腳本,可以這樣做嗎?從Symfony或Zend等大型框架中提取算法是非常困難的。也有許多不同的不明顯的情況下,像correctl處理的URL UTF-8編碼或magic_quotes_runtime的等等

+0

爲什麼你想保留舊系統?如果某人將舊網址添加到舊系統的網址中,並重新寫入新系統,即使該網址更改爲新系統,他們仍會到達正確的網站。 – Anthony 2010-01-13 20:15:45

+0

是的,這是正確的。你是什​​麼意思「保留舊系統」?我需要所有類型的鏈接同時工作。 – 2010-01-13 20:20:23

+0

如果您希望所有這些鏈接都轉到同一位置,只需將包含「showprofile」的所有請求重寫爲一個腳本,然後輸出該用戶名的配置文件即可。 – Anthony 2010-01-13 20:35:19

回答

1

如果您可以通過編程來區分所有不同類型的URL並將它們歸一化爲一個基本形式,那麼您可以編寫一個簡單的標記符函數來標準化不同類型,並且可以使用標準化類型來獲取實際目標。我已經這樣做了,但不是沒有mod_rewrite。很確定它可以完成沒有它,但。

我通常有分析任何URL,然後做了一堆的請求處理和路由,以獲得輸出一個索引文件,而不直接有任何URL映射到任何文件。只需mod_rewrite該索引文件的所有內容並解析$_SERVER['REQUEST_URI']

0

第一至第三,應通過傳遞給PHP進行處理($_GET$_SERVER["REQUEST_URI"]$_SERVER["QUERY_STRING"])。

第四可以使用RewriteCond !-f和適當RewriteRule mod_rewrite的來完成。

+0

我知道如何做到這一點。我只是不想重新發明輪子,如果某個地方已經存在這樣一個圖書館。 – 2010-01-13 20:47:15

0

你應該避免讓所有不同類型的網址。如果您發佈的所有網址都顯示相同的內容,那麼SE將會將其視爲重複內容,並最終「分裂」您的排名。換句話說,四個頁面中的每一個都將排在四分之一以及所有內容都集中在一個URL上......如果這是有道理的。

只要選擇一個URL格式很簡單,爲用戶,並堅持下去。我個人更喜歡最後一個,與mod_rewrite。您的問題意味着使用mod_rewrite時出現了某些「錯誤」,但這並不是。

您也可以使用之類的東西$_SERVER["REQUEST_URI"]檢測正在請求的URL,做301重定向到URL官方,如果這甚至是必要的。

+0

當然,一個網站將堅持一種類型的鏈接。爲防止內容分裂,您可以在一種鏈接類型上發送HTTP 301代碼。這是同時處理兩個鏈接的回退機制。作爲一個例子看看VB4的實現:http://www.vbulletin.com/forum/entry.php?2399-Friendly-URLs-and-Character-Encoding – 2010-01-15 12:17:10