apache 伪静态 RewriteMap的使用

文章转载自

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_pro\WWW\rewrite\urlmap.txt
  RewriteMap domainmap txt:D:\phpstudy_pro\WWW\rewrite\domainmap.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]


posted @ 2020-12-01 17:51  coder_xds  阅读(136)  评论(0编辑  收藏  举报