IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

apache的RewriteMap使用心得

某人的栖息地 2009-10-26 23:10:20 累计浏览 2,192 次
本机暂存

    在apache的环境下,rewrite还真是生活之友啊,时不时就得用上。前些日子有个需求,要将url重新转一转。

什么情况?

    原来的url

    http://www.xxx.com/demo/oldpage.php?param1=1¶m2=2

    转换后的url

    http://www.xxx.com/newpage.php?url=%2Fdemo%2Fmypage.php%3Fparam1%3D1¶m2%3D2

    需要把粗体部分的url进行urlencode,能看出上面的字符"?&="都分别转义过,作为参数发给另外一个url。那么这时候请出rewrite还真是最合适不过了。

坎坷的Rewrite经历

    查查rewrite手册,俺这才知道,转义这活,非得派出RewriteMap的map function才能做的比较漂亮。现在只有四个内部map function可供差遣:

toupper: Converts the key to all upper case.tolower: Converts the key to all lower case.escape: Translates special characters in the key to hex-encodings.unescape: Translates hex-encodings in the key back to special characters.

    那么很快就有了第一个rewrite出现:

    RewriteMap escape int:escape

    RewriteRule ^/([^/]*)$ /newpage.php?mi_url_suffix=${escape:$1?%{QUERY_STRING}} [L,PT]

    注:这里的int不是intger的意思,它是internal的缩写,表示调用内部函数。

    看上去非常简单,跑起来貌似也正....常?且慢,俺打开RewriteLog一瞅,形式不容乐观啊,"&"字符通通没有转义。看来是失败了,爬到狗狗上翻了一下,貌似escape对"?="之类的特殊字符是不做转义的,晕。

RewriteMap到底

    接着细看apache的rewrite手册,发现RewriteMap还支持自定义脚本,那么还得使出俺的看家绝技――php了。首先弄一个能转义的php,必须非常简单,复杂了apache容易挂掉,写出来发现想复杂都挺难啊:

    /usr/local/bin/escape.php

PHP:
#!/usr/bin/php -f
while($in = trim(fgets(STDIN)))
        fputs(STDOUT, urlencode($in) . "\\r\\n");
?>

    在这个脚本里可别使用php:://stdin之类的,具体原因查php手册。相应的,rewrite规则如下:

    RewriteMap escape prg:/usr/local/bin/escape.php

    RewriteRule ^/([^/]*)$ /newpage.php?mi_url_suffix=${escape:$1?%{QUERY_STRING}} [L,PT]

    rewrite规则没有太大的改变,prg表示使用自定义脚本。现在这个版本总算正常运作了。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,058)
  2. server日志的路径分析 (累计阅读 11,241)
  3. AWStats简介:Apache/Windows IIS的日志分析工具的下载,安装,配置样例和使用(含6.9中文定义补丁) (累计阅读 10,089)
  4. 查看 Apache并发请求数及其TCP连接状态 (累计阅读 10,070)
  5. PHP程序的执行流程 (累计阅读 10,035)
  6. nginx的配置文件 (累计阅读 9,885)
  7. Cacti 添加 Apache 监控 (累计阅读 9,245)
  8. 大型高并发高负载网站的系统架构分析 (累计阅读 9,006)
  9. 使用Apache 和Passenger来运行puppetmaster (累计阅读 8,319)
  10. 使用apache的404设置来转向可能不存在的页面 (累计阅读 8,208)