nginx rewrite 规则 与Apache rewrite 规则 参数多于9个时写法区别

时间:2021-01-19 11:29:36

     当url地址参数较多时,尤其像房产网、分类信息网站等筛选条件比较繁多的网站,常常可看到类似于此的访问地址:http://***.com/esf/bj_0_b2/m300,500h2a90,110c2s1x16f2,5/,其中bj、0、b2、m300,500、h2、a90,110、c2、s1、x16、f2,5 (1)这10个参数值分别代表着10个不同的参数的取值,改变这些值我们获取到的页面内容也就不一样。显然这个地址不是真实的地址,是伪静态地址,它可能的真实地址是这样的形式:http://***.com/esf/?city=bj&param1=0&param2=0&param3=b2&param4=300,500&param5=2

&param6=90,110&param7=2&param8=1&param9=16&param10=2,5。(2)

    服务器怎么知道用户访问地址1时把请求发到真实地址的地址2的呢?它是通过服务器配置文件的rewrite规则来实现的。

    nginx和apache的rewrite规则大体相似,也有细微差别之处:

    一则:当参数超过9个时,则需要把rewrite 规则分成两部分。以上面的地址为例说明。

    apache:

RewriteRule ^/esf/([a-z]*)_?(\d*)_?b?(\d*)/?m?([0-9,]*)h?(\d*)a?([0-9,]*)c?(\d*)s?(\d*)(.*)/$  $9&&param1=$1&param2=$2&param3=$3&param4=$4&param5=$5&param6=$6

&param7=$7&param8=$8  [C,NC]  -------------------------(1部分)
  RewriteRule ^x?(\d*)f?([0-9,]*)&&(.*)  /esf/index.php?$3&param9=$1&param10=$2 [QSA,L,NC] 

  -----------------------------------------(2部分)

    可见10个参数被分成了两条紧密相连的规则最终把静态地址1指向了动态地址2,为什么不能写成一条呢,因为apache rewrite不支持超过9个参数。注意,后面的[C,NC] 相当于修正符,C代表规则链条(chain)未结束,需要拼接下一条规则 L(last) 说明规则结束。需要指出的是“$9&&” ,意思是把第9个括号匹配到的内容(即剩下的2个参数值)连同已经匹配到的8个参数值作为第二条规则的被匹配的对象。

    nginx 在处理多于9个参数的时候,是采用重命名的方法来实现的:

     rewrite ^/([a-z]*)_?(\d*)_?b?(\d*)/?m?([0-9,]*)h?(\d*)a?([0-9,]*)c?(\d*)s?(\d*)x?(\d*)f?(?P<f>[0-9,]*)/$ /index.php?param1=$1&param2=$2&param3=$3&param4=$4&param5=$5

&param6=$6&param7=$7&param8=$8&param9=$9&param10=$f last;

    注意第10个参数f 通过?P<f>重命名为f ,当然也可以是其他名字,$f也要改成一致的就行了,如果有第11个参数o3,则在f?(?P<f>[0-9,]*)后面添加o?(?P<j>\d*)即可,对应的param10=$f 后面也要加&param11=$j。nginx 没有类似于apache 的修正符。