2009-07-24 109 views
3

在我的MVC應用程序中,我使用uri路由器,而不是確定使用哪個控制器和動作並檢測來自uri的GET參數。我寫它,這樣它會接受這兩種形式:使用mod_rewrite重寫查詢字符串

http://localhost/controller/action/param1Name/param1Value 
http://localhost/controller/action?param1Name=param1Value 

現在我想要做的是使用mod_rewrite重定向?p=v形式向/p/v形式(推理是純粹的外觀,GET形式使用?x=y表格)。然而,我完全陷入瞭如何做到這一點 - 我有一個想法,我需要使用${QUERY_STRING},但我不知道如何。

回答

2

如果你真的想形式的請求重定向到/controller/action?param1Name=param1Value/controller/action/param1Name/param1Value,試試這個:

RewriteCond %{THE_REQUEST} ^GET\ /[^/]+/[^/]+\?[^\s]+ 
RewriteCond %{QUERY_STRING} ^([^=&]+)=([^&]+)&?(.*) 
RewriteRule ^[^/]+/[^/]+.* /$0/%1/%2?%3 [N] 
RewriteCond %{THE_REQUEST} ^GET\ /[^/]+/[^/]+\?[^\s]+ 
RewriteRule ^[^/]+/[^/]+.* /$0 [L,R=301] 

但是,如果你想相反的方式:

RewriteRule ^([^/]+/[^/]+)/([^/]+)/([^/]+)(/.*) $1$4?$2=$3 [QSA] 
+0

這是一些瘋狂的正則表達式:)但它似乎並沒有爲我工作 - url中的GET參數保持原樣。 – Ross 2009-07-24 20:14:18

1

如果出於美觀的原因,您可能需要執行POST操作,然後查詢參數將不會顯示在URL中。

如果不是 - 我想親眼看到這個答案!

+0

如果不能,於是做了是的,我會採取這種方法。如果可能的話,仍然會很好。 – Ross 2009-07-24 20:07:40