【问题标题】:How to unescape QUERY_STRING in mod_rewrite?如何在 mod_rewrite 中取消 QUERY_STRING?
【发布时间】:2012-03-13 06:28:36
【问题描述】:

大家好,

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

重写规则如下:

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

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

【问题讨论】:

    标签: mod-rewrite apache2 escaping


    【解决方案1】:
    RewriteMap unescape int:unescape
    
    RewriteCond %{QUERY_STRING} ^url=(.+)$
    RewriteRule ^/redir$ ${unescape:%1} [R=301,L]
    

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

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

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

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

    unescape 就是您要找的。​​p>

    更多信息可以在mod_rewrite documentation找到。

    【讨论】:

      【解决方案2】:

      是的,有一种方法:将其提供给Php 文件,然后使用适当的“header”在Php 中进行重定向。

      类似:

      RewriteCond %{QUERY_STRING} ^url=(.+)$
      RewriteRule ^/redir$ /myredir.php?redir=%1 [R=301,L]
      

      在 PHP 中,在文件 myredir.php 中类似于:

      <?php
      if (isset($_GET['redir'])) {
          header("Location: ".urldecode($_GET['redir']));
      }
      exit;
      ?>
      

      【讨论】:

      • 是的,这种情况对于任何动态脚本语言来说都很容易。我认为如果在 Apache 服务器级别实现,性能会是最好的。
      • 你完全正确。但是性能不是问题,除非您有成千上万的访问者。如果不是这种情况,那么这个解决方案应该没问题。想一想:这是一个“临时解决方案”,如果事情进展顺利,我会再考虑一次。我的意思是:也许现在优化那个级别还为时过早。有时你有更重要的事情要做。并且知道 Php 被编译成字节码,它留在缓存中,我认为尝试获得一些皮秒的兴趣很少。
      猜你喜欢
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2014-07-22
      • 2012-04-17
      相关资源
      最近更新 更多