当前位置: 首页 > 图文教程 > 网络编程 > PHP > Apache服务器的RewriteMap

PHP
PHP学习中遇到的问题,请高手帮忙 - PHPchina
如何获取IIS虚拟目录的绝对路径 - PHPchina
常常说的SQL注入是怎么做的? - PHPchina
怎么对网站的Alexa排名的数据的采集? - PHPchina
遇到一个session丢失的问题。打开含有mediaplayer播放器的页面,会导致session丢失 -
做小偷遇到一个基础问题.请指教 - PHPchina
php5如何连接ACCESS 2003 - PHPchina
帮找下错误 - PHPchina
split 函数的一个问题 - PHPchina
一个全站系统的数据库设计问题,望大家都来帮帮忙 - PHPchina
分享我的PHP配置心得包含MYSQL5乱码解决 - PHPchina
深入浅出分析Linux设备驱动程序中断 (1)(3)
深入浅出分析Linux设备驱动程序中断 (1)(2)
深入浅出分析Linux设备驱动程序中断 (1)
OpenSSH可实现一次性自动管理多台服务器
如何利用程序循环来控制Perl脚本流程
PHP5应用笔记之Cookie实用攻略(上)
从失败中涉取经验 网站设计的十种常见错误
连载1:利用PHP创建由Oracle 驱动的SOAP服务
连载2:利用PHP创建由Oracle 驱动的SOAP服务

PHP 中的 Apache服务器的RewriteMap


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 159 ::
收藏到网摘: n/a

在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

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

在这个脚本里可别使用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表示使用自定义脚本。现在这个版本总算正常运作了。