用[C]关键字突破apache rewrite模块最多9个参数限制

来源:互联网 发布:网络语古耐是什么意思 编辑:程序博客网 时间:2024/06/03 20:30

众所周知apache的rewrite模块一条规则最多只能传递9个参数.但总是有特殊应用。这里记录的我工作中碰到的实际问题。


例子:
请求的URL形式:^/house/([^_^/]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)\.htm$
测试URL:/house/北京_____朝阳_住宅___________1.htm
我们想达到的效果
转换为以下形式
/house/web/Search_Result.php?strCity=$1&strComarea=$2&strRoundStation=$3&strStartDate=$4&strLiveDate=$5&strDistrict=$6&strPurpose=$7&StrNameKey=$8&StrNameKeyword=$9&strOrderBy=$10&strPrice=$11&character=$12&railway=$13&railway_station=$14&area_buy=$15&show_type=$16&saling=$17&PageNo=$18

共18个参数。超过了apache rewrite 每条规则最多处理9个参数的限制。

这里用到了 [c]关键字对URL进行拆分,目的是使每条RewriteRule处理的参数小于9个

1、RewriteRule^/house/([^_^/]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)\.htm  /house/$8.htmstrCity=$1&strComarea=$2&strRoundStation=$3&strStartDate=$4&strLiveDate=$5&strDistrict=$6&strPurpose=$7  [C,NC]
    $1~$7    匹配第1~7个参数
    $8    _(.*)匹配第7个参数后.htm之前所有字符.  $8 = __________1
    含义是 把匹配出的7个参数按既定格式附加在URL最后,把超出参数限制的部分合并到一个参数中,统一转交下一条通过[C]关键字关联的规则处理。
    
    执行结果
    /house/北京_____朝阳_住宅___________1.htm
    转换到
    /house/__________1.htmstrCity=北京&strComarea=&strRoundStation=&strStartDate=&strLiveDate=&strDistrict=朝阳&strPurpose=住宅'

2、RewriteRule ^/house/([^_^/]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)\.htm(.*)  /house/$7.htm$8&StrNameKey=$1&StrNameKeyword=$2&strOrderBy=$3&strPrice=$4&character=$5&railway=$6  [C,NC]
    
    $1~$6    匹配第8~13个参数
    $7    第13个参数之后到.htm之前的部分 $7=____1
    $8    匹配上一条规则生成的参数部分,$8=strCity=北京&strComarea=&strRoundStation=&strStartDate=&strLiveDate=&strDistrict=朝阳&strPurpose=住宅' ->'/house/____1.htmstrCity=北京&strComarea=&strRoundStation=&strStartDate=&strLiveDate=&strDistrict=朝阳&strPurpose=住宅&StrNameKey=&StrNameKeyword=&strOrderBy=&strPrice=&character=&railway=
    传递数据占用了两个参数,所以本条只能匹配6个参数。
    
    执行结果
    /house/__________1.htmstrCity=北京&strComarea=&strRoundStation=&strStartDate=&strLiveDate=&strDistrict=朝阳&strPurpose=住宅
    转换到    
    /house/____1.htmstrCity=北京&strComarea=&strRoundStation=&strStartDate=&strLiveDate=&strDistrict=朝阳&strPurpose=住宅&StrNameKey=&StrNameKeyword=&strOrderBy=&strPrice=&character=&railway='

3、RewriteRule/house/([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)\.htm(.*)  /house/web/Search_Result.php?$6&railway_station=$1&area_buy=$2&show_type=$3&saling=$4&PageNo=$5[QSA,L,NC]
    $1~$5    匹配第14~18个参数
    $6    匹配上一条规则生成的参数部分
    [L]表示这是最后一条规则
    [QSA]强制追加请求。
    执行结果
    /house/____1.htmstrCity=北京&strComarea=&strRoundStation=&strStartDate=&strLiveDate=&strDistrict=朝阳&strPurpose=住宅&StrNameKey=&StrNameKeyword=&strOrderBy=&strPrice=&character=&railway=
    转换到
    /house/web/Search_Result.php?strCity=北京&strComarea=&strRoundStation=&strStartDate=&strLiveDate=&strDistrict=朝阳&strPurpose=住宅&StrNameKey=&StrNameKeyword=&strOrderBy=&strPrice=&character=&railway=&railway_station=&area_buy=&show_type=&saling=&PageNo=1


用到的rewrite标志 关键字
L (last rule) 表明当前规则是最后匹配的规则,停止匹配以后的规则。
C(chained with next rule) 与下一条规则关联.(如果[C]规则匹配则转交下一个规则处理,如果不匹配,那么下面所有关联的规则都跳过。)
NC(no case) 不区分大小写






  RewriteRule ^/([0-9]+)_([0-9]+)/([0-9]+)/([0-9]+)/([0-9]+)/([a-zA-Z0]+)/([0-9]+)/([0-9]+)/(.*)/$ /$9.htmlbegin=$1&end=$2&age=$3&mile=$4&autos=$5&logo=$6&catesubclass=$7&brand=$8 [C,NC]
RewriteRule ^/([a-zA-Z0-9]+)/p_([0-9]+).html(.*)$ /ceshi.php?$3&cityid=$1&page=$2 [QSA,NC,L]

原创粉丝点击