zoukankan      html  css  js  c++  java
  • 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_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]


  • 相关阅读:
    bzoj5137 [Usaco2017 Dec]Standing Out from the Herd
    bzoj2434 [Noi2011]阿狸的打字机
    【20181024T2】小C的序列【GCD性质+链表】
    【20181024T3】小C的宿舍【分治】
    【20181024T1】小C的数组【二分+dp】
    【20181023T2】行星通道计划【二维BIT】
    【20181023T1】战争【反向并查集】
    【20181020T1】蛋糕
    【20181019T2】硬币【矩阵快速幂优化DP】
    【20181019T3】比特战争【最小生成树思想】
  • 原文地址:https://www.cnblogs.com/xiangdongsheng/p/14056961.html
Copyright © 2011-2022 走看看