2009-09-16 42 views
0

我使用apache的mod_rewrite來使我的應用程序的URL很漂亮。我掌握了mod_rewrite的基礎知識 - 我的應用程序的幾個部分使用簡單和可預測的重寫。用mod_rewrite處理多個可選參數

但是,我寫了一個博客功能,它使用了幾個不同的參數。

http://www.somedomain.com/blog/ 
http://www.somedomain.com/blog/tag/ 
http://www.somedomain.com/blog/page/2/ 

,我有以下規則在我的.htaccess:

RewriteRule ^blog/ index.php?action=blog [NC] 
RewriteRule ^blog/(.*) index.php?action=blog&tag=$1 [NC] 
RewriteRule ^blog/page/(.*) index.php?action=blog&page=$1 [NC] 

但是,規則不在一起工作。計算機符合第一條規則,然後停止處理 - 儘管以我的思維方式,它不應該匹配。我告訴機器要匹配^blog/,它會繼續,並匹配^blog/tag/^blog/page/2/,這對我來說似乎是錯誤的。

我的規則出了什麼問題?爲什麼他們沒有按照我的意圖進行評估?

編輯:答案是終止使用$輸入,並重新排序的規則,非常輕微:

RewriteRule ^blog/$ index.php?action=blog [NC,L] 
RewriteRule ^blog/page/(.*)$ index.php?action=blog&page=$1 [NC,L] 
RewriteRule ^blog/(.*)$ index.php?action=blog&tag=$1 [NC,L] 

這些規則產生預期的效果。

回答

2

如果你不想做^blog/匹配什麼比這更,指定在比賽中輸入的結束還有:

^blog/$ 

然而,這樣許多應用程序做到這一點是隻是有一個所有URL重定向到的單個頁面,然後在頁面代碼內部處理剩餘的URL。通常,大多數Web語言都有一種方法來獲取原始請求的URI,即使Apache將它們全部指向同一頁面,也可以解析該URI以確定指定了哪些「變量」。然後通過includes或其他一些框架/模板引擎,您可以加載正確的邏輯。

另一個說明 - 通常「更一般」的重寫規則放在最後,以便匹配更具體的重定向的內容將首先被處理。這與規則之後的[L]選項相結合,將確保如果更具體的規則匹配,則不會評估更通用的規則。

+0

DAV,你的「輸入端」的一部分是非常有益的。我會更新我的問題以反映答案。謝謝! – EvilChookie 2009-09-16 01:10:29

2

我認爲你需要的[NC]語句後添加[L],否則它會繼續,即使它已經匹配

+0

你是對的。我原本是把它們放在我的規則中,但把它們作爲填充它的一部分。 – EvilChookie 2009-09-16 01:09:58