Apache rewriteRule:使用查询string添加目标URL参数

我试图通过TARGET_URL参数将我的原始URL作为servlet控制器的查询string传递。 是否有可能为TARGET_URL做一个URLencode?

这里是一个例子:原单: http ://myhost.com/app1/navigationControler?page=2&u=0会变成: http ://myhost.com/app2/controller?TARGET_URL= http% 3a%2f%2fmyhost.com %2fapp1%2fnavigationControler%3fpage%3D2%26U%3D0

是的,这是可能的使用mod_rewrite和一个'逃生'重写地图。 请参阅http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritemap

首先,您需要在您的服务器或虚拟主机configuration中定义重写映射,如下所示:

RewriteMap escaped int:escape 

这将创build一个名为“转义”的重写映射,将string中的特殊字符转换为其hex编码。 你可以像这样使用它$ {escaped:text to escape}。

接下来,您需要处理一组适当的重写规则,将信息传递给您的处理程序:

 RewriteRule .* - [E=HT:http] RewriteCond %{HTTPS} =on RewriteRule .* - [E=HT:https] RewriteRule .* %{ENV:HT}://myhost.com/app2/controller/?TARGET_URL=${escaped:%{ENV:HT}://%{HTTP_HOST}%{REQUEST_URI}?%{QUERY_STRING}} 

前三行确定在最终重写中是否应该使用“http”或“https”。 最后一行通过转义重写映射将原始URL放在一起,并将它发送到您的servlet /处理程序。

这有点复杂,因为它试图处理http和https。 一个问题是,它将始终包括? char,即使原始请求没有查询string。

我最后的意见是build议你考虑只是代理或使用AJP到您的servlet控制器,这将使所有这些URL参数操作不必要。

你可以在外部程序的帮助下做到这一点。 mod_rewrite支持rewrite_mapfunction。 但它有各种性能警告。

你能解释一下为什么你想这样做呢? 为什么你不能把它保持原样呢?

也许是这样的:

 RewriteEngine On RewriteRule ^/(app1/.*) http://myhost.com/app2/controller?TARGET_URL=http://myhost.com/$1