我正在編寫一個從URL獲取數據的應用程序,但我想讓它成爲用戶是否使用「乾淨」URL的應用程序(例如: http://example.com/hello/world)或「髒」的網址(例如:http://example.com/?action=hello&sub=world)。從「乾淨」和「髒」URL獲取數據的最佳方式
從兩種URL方案獲取變量的最佳方式是什麼?
我正在編寫一個從URL獲取數據的應用程序,但我想讓它成爲用戶是否使用「乾淨」URL的應用程序(例如: http://example.com/hello/world)或「髒」的網址(例如:http://example.com/?action=hello&sub=world)。從「乾淨」和「髒」URL獲取數據的最佳方式
從兩種URL方案獲取變量的最佳方式是什麼?
如果你的mod_rewrite有類似如下的規則:
RewriteRule ^hello/world /?action=hello&sub=world [NC,L]
,或者更廣義的:
// Assuming only lowercase letters in action & sub..
RewriteRule ^([a-z]+)/([a-z]+) /?action=$1&sub=$2 [NC,L]
那麼相同的PHP腳本被調用,與現有的$_REQUEST
變量無論怎樣用戶訪問該頁面(髒或乾淨的URL)。
我們最近將我們網站的大部分內容移到了清理網址(仍然支持較舊的「髒」網址)和上述規則,這意味着我們不必重寫任何依賴於params的代碼,只有mod_rewrite規則。
更新
mod_rewrite的是一個Apache模塊,但也有許多選項available for IIS也。
無論您決定支持哪種Web服務器,mod_rewrite方法都可能會爲您帶來最少的工作量。沒有它,你可能需要創建一些文件來模仿你乾淨的URL的結構,例如在Web服務器的根你會創建一個目錄hello
,將文件放在world
進去,含有類似如下:
// Set the $_REQUEST params to mimic dirty url
$_REQUEST['action'] = 'hello';
$_REQUEST['sub'] = 'world';
// Include existing file so we don't need to re-do our logic
// (assuming index.php at web root)
include('../index.php');
當你想處理「乾淨地」增加參數的數量,於是將數您需要的目錄和存根文件,這會大大增加您的維護負擔。
mod_rewrite是專門爲這類問題設計的,現在在IIS和Apache上都支持,所以我強烈建議朝這個方向發展!
這裏唯一的問題是我想支持的不僅僅是Apache,所以使用.htaccess不起作用。 – 2008-12-31 19:51:16
聽起來很痛苦,但我想創建一個函數來分析每個請求的URL。首先確定它是否是「髒」或「乾淨」的URL。爲此,我會首先查找問號字符的存在並從那裏繼續(顯然需要額外檢查)。對於「髒」URL,使用PHP的普通Get方法檢索功能($ variable_name)。對於「乾淨」的,我會使用正則表達式。這將是解析URL並提取潛在變量的最靈活(且高效)的方式。
如果你的應用程序運行在Apache服務器上,我會建議使用mod_rewrite。
基本上,你編寫的應用程序使用裏面的「髒」的URL。我的意思是,你仍然可以在模板等中使用「乾淨」的URL,但在解析URL時使用「髒」版本。就像,你是真實的,「diry」的URL是www.domain.com/index.php?a=1 & b = 2,在你的代碼裏你仍然會使用$ _GET ['a']和$ _GET [ 'b']。然後,使用mod_rewrite的強大功能,只需將www.domain.com/1/2/這樣的URL指向「髒」URL即可。(這只是一個事情如何完成的例子)
一個快速和骯髒的方法可能是簡單地檢查GET變量。如果有的話,它很髒,如果不是,它很乾淨。當然,這取決於您的髒網址究竟是什麼意思。
難道只有這兩個選擇嗎?或者,您可以http:// http://example.com/hello?sub=world或http://example.com/world/hello?那麼http://example.com/hello/world?action=somethingelse&sub=different呢? – 2008-12-31 19:14:06