mod_rewrite:将path和查询stringURL作为parameter passing

我使用mod_rewrite将相当URL重写为Spring 2.5应用程序支持的表单。

eg /category/cat1?q=x => /controller?category=cat1&q=x 

然而,从我的控制器我想知道请求来自原始URL(所以我可以生成一个链接,如果需要的话)。 所有页面都需要这种方法,因此很难进行硬编码。

我如何从我的控制器访问原始path+查询string?

我曾尝试使用$ 0来包含完整的path,但是这不包括查询string。 我不能只追加path和查询string,因为这会导致path的一些部分被添加为参数/category/cat1?category=cat1&q=x请注意添加了不需要的&category=cat1参数,这会导致URL不再与浏览器发送的URL匹配。

我希望mod_rewrite将让我引用完整的url,并将其编码为一个参数,所以我的规则可能看起来像:

 RewriteRule /category/(.+) /controller?category=$1&_originalUrl=${escape:$0}?${escape:<original query string>} [QSA] 

使用我的原始示例,传递给我的控制器的最终结果是:

 /controller?category=cat1&_originalUrl=%2Fcategory%2Fcat1%3Fsearch%3Dx&search=x 

重要的部分是&_originalUrl的值应该是%2Fcategory%2Fcat1%3Fsearch%3Dx ,它的非转义版本是/category/cat1?q=x (从浏览器发送的原始请求URL)。

任何build议欢迎,提前致谢!

查询可以用RewriteCond测试,因为RewriteRule只测试URL路径 。 看Jonathan Feinberg的例子是怎么做的。

但是你也可以设置QSA标志 ,旧的查询会自动附加到新的:

 RewriteRule ^/category/([^/]+)$ /controller?category=$1 [QSA] 

编辑为了回应你对这个问题的评论:如果你想得到初始的请求URI路径和查询,你需要从请求行 ( THE_REQUEST变量)中提取它:

 RewriteCond %{THE_REQUEST} ^[AZ]+\ ([^\s]+) RewriteRule ^/category/([^/]+)$ /controller?category=$1&_originalUrl=%1 [QSA] 

但是在大多数语言中都有一个具有相同信息的环境变量。

您必须在初始的单独步骤中捕获查询字符串。

 RewriteCond %{query_string} ^q=([^&]+) RewriteRule ^/category/(cat1)$ /controller?category=$1&q=%1 

等等

有可以使用的主机头? 对不起,如此含糊,但最后一次我不得不这样做是使用PHP(呃,不要问),我想我们是如何做到这一点 – 例如REQUEST_URI( http://www.askapache.com/htaccess/mod_rewrite-变&#x91CF; – cheatsheet.html )

你也可以在rewrite中设置一个主机头( http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

例如:

 ReWriteRule /category/(cat1)?q=(x) /controller?category=$1&q=$2 [E=FOO:....] 

(不,我完全不是一个mod改写忍者)