`
阿尔萨斯
  • 浏览: 4186129 次
社区版块
存档分类
最新评论

apache的RewriteMap使用心得

 
阅读更多

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

什么情况?

原来的url
http://www.xxx.com/demo/oldpage.php?param1=1&param2=2

转换后的url
http://www.xxx.com/newpage.php?url=%2Fdemo%2Fmypage.php%3Fparam1%3D1&param2%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


iG:Syntax Hiliter » Plain-Text Viewbody { margin:0px; padding:0px; white-space:nowrap; }
#!/usr/bin/php -f
<?php
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表示使用自定义脚本。现在这个版本总算正常运作了。

分享到:
评论

相关推荐

    Apache HTTP Server Version 2.2 文档(2013.4.10最新)

    httxt2dbm - 生成RewriteMap指令使用的dbm文件 服务器和支持程序 logresolve - 解析Apache日志中的IP地址为主机名 其他程序 rotatelogs - 滚动Apache日志的管道日志程序 suexec - 在执行外部程序之前切换用户 URL...

    apache 二级域名解析实现方法

    代码如下: RewriteEngine on RewriteMap lowercase int:tolower RewriteMap vhost txt:/usr/local/etc/apache/vhost.map RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$ RewriteCond ${vhost:%1} ^(/.*)$ ...

    Apache服务器二级域名的完美实现

    其次,在 httpd.conf 中打开 mod_rewrite 之后,在 httpd.conf 的最后,添加以下内容: RewriteEngine on RewriteMap lowercase int:tolower RewriteMap vhost txt:/usr/local/etc/apache/vhost.map RewriteCond ${...

    aem-vanity-mapper:一切

    然后将结果写入 apache RewriteMap 文件,与 mod_rewrite 一起使用,以从配置的虚 url 映射到完全限定的 AEM 路径。 该工具的存在使内容作者仍然可以在 AEM 中管理虚 URL,但您的调度程序过滤器仍然可以根据请求...

    httpd.conf 二级域名设置方法

    之后,在 httpd.conf 的最后,添加以下内容: 代码如下:RewriteEngine on RewriteMap lowercase int:tolower RewriteMap vhost txt:/usr/local/etc/apache/vhost.map RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)...

    IIS服务器SSI(rewrite重写)插件的帮助资料

    4.9REWRITEMAP指令 36 4.10REWRITELOG指令 38 4.11REWRITELOGLEVEL指令 39 4.12REWRITEOPTIONS指令 39 4.13REWRITECOMPATIBILITY2指令 39 4.14ERRORLOG指令 40 4.15LOGLEVEL指令 40 4.16指令 41 4.17指令 41 4.18...

    iis-urlrewrite-generator:转换源 + 目标 URL 的 CSV 并生成 IIS UrlRewrite 映射以放置在 web.config 中

    使用重定向映射的已配置重写规则 生成重写映射 控制台应用程序接受两个参数:CSV 文件的路径和重写映射的名称。 redirectmapgenerator.exe "redirects.csv" "Website Cutover" 将重写映射插入 web.config 输出...

Global site tag (gtag.js) - Google Analytics