Regex mod_rewrite:传递路径&;查询字符串URL作为参数

Regex mod_rewrite:传递路径&;查询字符串URL作为参数,regex,apache,url,mod-rewrite,parameters,Regex,Apache,Url,Mod Rewrite,Parameters,我使用mod_rewrite将漂亮的URL重写为Spring 2.5应用程序支持的表单 e.g. /category/cat1?q=x => /controller?category=cat1&q=x 但是,从我的控制器,我想知道请求来自的原始URL(因此,如果需要,我可以生成一个链接)。所有页面都需要这种方法,因此很难硬编码 如何从控制器访问原始路径+查询字符串 我尝试使用$0包含完整路径,但这不包括查询字符串。我不能仅仅附加路径和查询字符串,因为这会导致路径的某些部分被

我使用mod_rewrite将漂亮的URL重写为Spring 2.5应用程序支持的表单

e.g. /category/cat1?q=x   =>  /controller?category=cat1&q=x
但是,从我的控制器,我想知道请求来自的原始URL(因此,如果需要,我可以生成一个链接)。所有页面都需要这种方法,因此很难硬编码

如何从控制器访问原始路径+查询字符串

我尝试使用$0包含完整路径,但这不包括查询字符串。我不能仅仅附加路径和查询字符串,因为这会导致路径的某些部分被添加为参数
/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]
重要的部分是
和_originalUrl
的值,它应该是
%2fcontegory%2Fcat1%3Fsearch%3Dx
,在其未替换版本中是
/category/cat1?q=x
(从浏览器发送的原始请求URL)


欢迎任何建议,提前谢谢

是否有可以使用的主机头?抱歉说得这么含糊,但上次我不得不这么做是使用PHP(呃,不要问),我想我们就是这样做的-例如REQUEST_URI()

您还可以在重写()中设置主机头

例如:


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

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

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

等等。

查询只能用测试,因为它只测试。参见Jonathan Feinberg的例子如何做到这一点

但您也可以只设置一个查询,旧查询将自动附加到新查询:

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

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


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

感谢QSA示例。很抱歉,我的示例不太准确,我正在使用[QSA]将原始查询字符串自动附加到重写的URL。我试图实现的是获取用户在浏览器中看到的原始(未写入的)路径+查询字符串,并将其作为编码参数传递给我的控制器。@richardpaul:在这种情况下,您应该从请求行提取该信息:
RewriteCond%{the_request}^[A-Z]+\([^\s]+)RewriteRule^/category/([^/]+)$/controller?category=$1&_originalUrl=%1
我发现了一个转义函数${escape:$1},现在我需要解决如何附加路径和原始查询字符串${escape:$0}${escape:}在单独的参数中接收原始路径和查询字符串将是一个合适的解决方案。e、 g.&_originalPath=${escape:$0}&_originalQueryString=${escape:}是我不知道如何获取的部分。您好,有一个类似的问题需要解决,但int:escape重写映射似乎无法解决问题:它不是url编码(如将/转换为%2F,&转换为%26等),只是编码url中不允许的字符。我能看到的最后一个选择是使用外部映射程序,但它只是陷入了更多的麻烦。。。或者在重写后的URL后面加上“original_qs=”谢谢你的回复,我原来的问题有点含糊不清。我不关心主机名,只关心原始路径和查询字符串。我已经相应地更新了这个问题。谢谢,但是我需要捕获整个查询字符串,并且它需要以一种通用的方式(我不知道将传递什么参数)。我已经根据Gumbo的建议更新了这个例子,使用QSA。我的答案中有足够的信息让你走上正确的道路。祝你好运
RewriteCond %{query_string} ^q=([^&]+)
RewriteRule ^/category/(cat1)$ /controller?category=$1&q=%1
RewriteRule ^/category/([^/]+)$ /controller?category=$1 [QSA]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ ([^\s]+)
RewriteRule ^/category/([^/]+)$ /controller?category=$1&_originalUrl=%1 [QSA]