如何在 mod_rewrite 中取消转义 QUERY_STRING?

0 mod-rewrite escaping apache2

大家好,

现在我想使用apache2中的mod_rewrite模块来重定向url。

重写规则如下所示:

RewriteCond %{QUERY_STRING} ^url=(.+)$
RewriteRule ^/redir$ %1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

但是,当输入 http://website.com/redir?url=http%3A%2F%2Fwww.google.com 时,mod_rewrite 模块无法取消 url 参数 http%3A%2F%2Fwww.google.com,为有什么方法可以解决这个问题吗?

Ric*_*her 5

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING} ^url=(.+)$
RewriteRule ^/redir$ ${unescape:%1} [R=301,L]
Run Code Online (Sandbox Code Playgroud)

Apache 允许您定义来自不同类型外部源的自定义重写映射。例如,如果您想要重写/users/<some alias>为/users/<full name>,您可以有一个指定别名/名称对的文本文件,以及一个使用该映射转换 URL 的“别名”部分的重写规则。

映射可以来自多种类型的源。别名/名称示例是标准纯文本 ( txt) 类型。

RewriteMap还可以让您映射到一些特殊的内部源 ( int)。它们只是将值传递给内部 Apache 函数并返回结果。他们是:

  • toupper:将密钥转换为全部大写。
  • tolower:将密钥转换为全部小写。
  • escape:将密钥中的特殊字符转换为十六进制编码。
  • unescape:将密钥中的十六进制编码转换回特殊字符。

unescape这就是您正在寻找的。

更多信息可以在mod_rewrite 文档中找到。