Apache rewriteRule:使用查询字符串添加目标 URL 参数

Apache rewriteRule:使用查询字符串添加目标 URL 参数

我正在尝试使用 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

相关内容