众所周知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]