我使用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-变量 – 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改写忍者)