我正在尝试使用 TARGET_URL 参数将原始 URL 作为查询字符串传递给 servlet 控制器。是否可以对 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
答案1
是的,使用 mod_rewrite 和“转义”重写映射是可能的。请参阅http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritemap
首先,您需要在服务器或虚拟主机配置中定义重写映射,如下所示:
RewriteMap escaped int:escape
这将创建一个名为“escaped”的重写映射,它将字符串中的特殊字符转换为其十六进制编码。您可以像这样使用它:${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。一个问题是,?
即使原始请求没有查询字符串,它也始终会包含字符。
我的最后一条评论是建议您考虑仅代理或使用 AJP 到您的 servlet 控制器,这将使所有这些 URL 参数操作变得没有必要。
答案2
您可以借助外部程序来实现这一点。mod_rewrite 通过 rewrite_map 功能支持这一点。但它存在各种性能警告。
您能否进一步解释一下您为什么首先想要这样做?为什么您不能保持原样?
答案3
也许是这样的:
RewriteEngine On
RewriteRule ^/(app1/.*) http://myhost.com/app2/controller?TARGET_URL=http://myhost.com/$1