2010-08-20 38 views
1

考慮這個規則的mod_rewrite - 轉換路徑,查詢字符串

RewriteRule ^/models/(.*)/(.*)$ /models?$1=$2 [NC,L] 

這個重寫/models/application/lawnmower/models?appliction=lawnmower

不錯,只是我想

現在考慮這個規則是什麼(有多達6名/值對)

RewriteRule ^/models/(.*)/(.*)/(.*)/(.*)$ /models?$1=$2&$3=$4 [NC,L] 

這應該重寫

/models/application/lawnmower/series/xp 

/models?application=lawnmower&series=xp 

但它實際上創造

/models?application/lawnmower=series&GX= 

ultimatly,我需要做的就是採取一切遵循/模型值,並將其解析爲名稱/值對qs形式

任何想法

回答

1

有了更多信息,它可能會帶上任意數量的鍵值對,並將它們轉換爲查詢字符串以傳遞給您的腳本。如果我沒有記錯的話,Gumbo回答了一個類似的問題,用一種「循環」來允許這樣的事情。

但是,正如我相信他當時指出的那樣,我現在會指出,與mod_rewrite這樣做實在不是一個好主意。這是更好的,只是有mod_rewrite重寫URL到您的腳本:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^/models/.*$ /models [NC,L] 

...然後解析原REQUEST_URI值來提取所需的信息。您所選擇的腳本語言比mod_rewrite更適合執行此任務。

至於修補你當前的規則,我想也許你對服務器的請求有一個尾部的斜槓?由於您的(.*)分組可以匹配任何內容(或不分配任何內容),因此如果您之後還有其他三個斜槓,他們會將第一個斜槓作爲關鍵名稱的一部分。簡單的解決辦法是不是在你的拍攝組相匹配的斜線:

RewriteRule ^/models/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /models?$1=$2&$3=$4 [NC,L] 

需要注意的是,如果你想做到這一點作爲一個系列的六個獨立的規則,你要用完反向引用,因爲你可以得到的最多(你定義的)在這裏是9.

+0

@jason - 我只是指出,如果你的URL變得太複雜,就效率和簡單性而言,讓腳本執行從URL中解析數據的工作,而不是使用'mod_rewrite'來完成。在這種情況下,您將使用'mod_rewrite'將URL更改爲指向您的腳本,然後使用腳本確定鍵值對應該是什麼。 – 2010-08-20 19:07:13

+0

@jason - 哈哈,抓住JavaScript文件。 – 2010-08-20 19:08:49

+0

ahhh ...有道理 – jason 2010-08-20 19:11:08