2013-01-20 92 views
1

我有以下規則:的.htaccess規則優先

RewriteRule ^app ?page=app [QSA] 
RewriteRule ^app/([0-9]+) ?page=app&id=$1 [QSA] 
RewriteRule ^app/([0-9]+)/edit ?page=edit&id=$1 [QSA] 

我的頁面打印GET PARAMS。當我打電話/應用程序,以下是印刷:

Array ([page] => app) 

當我打電話/應用/ 123或/應用/ 123 /編輯,打印保持相同。但是,當我顛倒這些命令的順序時,我得到了不同的結果。

對於/應用/ 123 /編輯:

Array ([page] => edit [id] => 123) 

對於/應用/ 123:

Array ([page] => app [id] => 123) 

這是爲什麼?另外,有沒有辦法改變這種情況,因爲從頂部到底部的層次順序通過命令看起來更容易,而不是相反。提前致謝。

回答

3

在這種情況下,你將不得不使用「字符串的結束」符號$

RewriteRule ^app$ ?page=app [QSA] 
RewriteRule ^app/([0-9]+)$ ?page=app&id=$1 [QSA] 
RewriteRule ^app/([0-9]+)/edit$ ?page=edit&id=$1 [QSA] 

否則,因爲你的第一個EXP符合所有您的網址形式,它總是使用,規則檢查永遠不會使其對線路2

+0

非常感謝。我會在10分鐘內接受你的回答。 – arik

+0

雖然有一個問題:我怎麼能讓這部分/ [0-9] + /添加?id = $ 1 [QSA]部分到下面的所有頁面/應用程序中,而我不必明確地重複這一點?id = $ 1表達式在隨後的表達式? – arik

+0

問題中的第二條和第三條規則應該得到使用,因爲從不指定L標誌。不知道他們爲什麼不這樣做,但你在這裏所做的只是迫​​使一條規則被遵守。 –

0

這裏是一個非常方便的資源:

http://martinmelin.se/rewrite-rule-tester/

究其原因,山高nd和third不匹配的是你的第一條規則的輸出消除了最初的URI。

你想要的實際規則是:

RewriteRule ^(app/?.*) $1?page=app [QSA] 
RewriteRule ^(app/([0-9]+)/?.*) $1?page=app&id=$2 [QSA] 
RewriteRule ^(app/([0-9]+)/edit) $1?page=edit&id=$2 [QSA] 

與測試頁aboves應用程序/ 123 /編輯測試這些顯示規則的所有比賽,併爲適用於:

# Match? Rule Resulting URL 
1 yes RewriteRule ^(app/?.*) $1?page=app [QSA] app/123/edit?page=app 
2 yes RewriteRule ^(app/([0-9]+)/?.*) $1?page=app&id=$2 [QSA] app/123/edit?page=app?page=app&id=123 
3 yes RewriteRule ^(app/([0-9]+)/edit) $1?page=edit&id=$2 [QSA] app/123/edit?page=edit&id=123 

我不t認爲測試人員正在正確處理QSA標誌。我只需要在每個規則中指定新的鍵/值對,而不必重複先前的那個(s)。 QSA應該合併它們。你的規則中真正的錯誤是不保存URI。