我试图通过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