使用mod_rewrite重写查询字符串

时间:2009-07-24 20:00:05

标签: apache mod-rewrite

在我的MVC应用程序中,我使用uri路由器而不是确定要使用哪个控制器和操作,并检测来自uri的GET参数。我写了它以便接受这两种形式:

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

现在我想要做的是使用mod_rewrite将?p=v表单重定向到/p/v表单(推理纯粹是装饰性的,GET表单使用?x=y表单)。我完全不知道如何做到这一点 - 我有一个想法,我需要使用${QUERY_STRING},但我不确定如何。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

如果您出于美观原因这样做,则可能需要执行POST,然后查询参数将不会显示在URL中。

如果没有 - 我想亲自看看这个答案!