文章转载自
https://www.cnblogs.com/peter-yan/p/7661741.html
https://blog.csdn.net/chuifuhuo6864/article/details/100882211
特点
apache的rewrite模块进行rewrite的时候,需要将规则直接写到http.conf的rewrite模块中,并且规则变动一次就需要重启apache服务器一次。这个让开发者比较郁闷。这里有一个rewriteMap解决了部分的问题,他的工作就是将一个映射关系以Map的形式存储在一个文件中,我们可以通过修改这个文件的对应关系而不需要重启apache服务器就可以应用映射关系。
一般这种策略用来做虚拟主机销售的时候使用,将域名绑定到指定的目录上,现在我将这个拓展下,不单单可以将指定的域名绑定到某个目录,还可以将域名动态的rewrite
定义一个扩展方法的语法为
RewriteMap MapName MapType:MapSource
MapName为方法名,可以是任意的字符串(避免使用服务器保留字,应该会有问题)
MapType是方法的类型,可选类型有txt,rnd,dbm,int,prg,dbd,fastdbd
MapSource是不同类型下的执行方法,类似于编程语言里的函数的方法体,暂时先这样理解,后面会具体描述
扩展方法的使用
${
MapName :
LookupKey }
${
MapName :
LookupKey |
DefaultValue }
MapName为扩展方法定义时的方法名
LookupKey是传入方法的参数
DefaultValue为默认值,如果方法返回空串,则返回默认值
map文件的几种类型
- txt 文本类型
如果方法类型为txt,则MapSource为一个文本文件,文件文件的内容是每行以空格为分割符的键值对,可以有注释,注释以#开头。查询到的键值对会被httpd缓存,除非服务器重启或者是MapSource文本文件修改时间变更
s1 w1
- rnd 文本类型扩展(随机)
如果方法类型为rnd,类似于txt类型,不过文本文件中键值对中的值可以有多个,用|分割,匹配到键之后,随机返回某一个值
s1 w1|w2|w3
s2 w4|w5|w6
- int 内部方法
如果方法类型为int,表明使用内部方法,大小写转化,编码特殊字符,解码特殊字符
RewriteMap lc int:tolower
RewriteRule (.*) ${lc:$1} [R]
- dbm dbm hash file
如果方法类型为dbm,表明使用hash文件,和文本文件的区别在于有索引,更高效且也支持缓存查询到的键。使用的hash文件可以由文本文件通过httxt2dbm工具生成,生成的hash文件有sdbm,
gdbm,
ndbm,
db四种类型
- dbd 或者 fastdbd
如果方法类型为dbd或fastdbd,表明使用sql查询。使用此种类型需要确保数据库模块(mod_dbd)被正确配置。sql查询返回可能不止一行,如果是多行的情况,则随机使用一行。dbd和fastdbd两者的区别在于dbd每次请求都会去查询数据库,而fastdbd会缓存数据库查询,除非服务器重启。fastdbd更高效更快
- prg 自定义脚本
如果方法类型为prg,表明使用自定义脚本处理,传入脚本的值通过stdin接收,返回的值通过stdout返回
实例
在apache配置文件httpd.conf里添加如下两行配置
RewriteMap urlmap txt:D:phpstudy_proWWW
ewriteurlmap.txt
RewriteMap domainmap txt:D:phpstudy_proWWW
ewritedomainmap.txt
urlmap.txt
1 www.jd.com
2 www.sina.com
3 www.baidu.com
domainmap.txt
1 www.a.com
2 www.b.com
3 www.c.com
#请求的文件不存在时,执行下面的重写下面的重写规则
RewriteCond ${urlmap:%{REQUEST_FILENAME} !-f
RewriteRule ^(.*).html$ $1.php [L]
#
RewriteRule ^(.*).html$ ${urlmap:$1|localhost} [L]
RewriteRule ^(.*).php$ ${domainmap:$1|localhost} [L]