当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¶m1=0¶m2=0¶m3=b2¶m4=300,500¶m5=2
¶m6=90,110¶m7=2¶m8=1¶m9=16¶m10=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&¶m1=$1¶m2=$2¶m3=$3¶m4=$4¶m5=$5¶m6=$6
¶m7=$7¶m8=$8 [C,NC] -------------------------(1部分)
RewriteRule ^x?(\d*)f?([0-9,]*)&&(.*) /esf/index.php?$3¶m9=$1¶m10=$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¶m2=$2¶m3=$3¶m4=$4¶m5=$5
¶m6=$6¶m7=$7¶m8=$8¶m9=$9¶m10=$f last;
注意第10个参数f 通过?P<f>重命名为f ,当然也可以是其他名字,$f也要改成一致的就行了,如果有第11个参数o3,则在f?(?P<f>[0-9,]*)后面添加o?(?P<j>\d*)即可,对应的param10=$f 后面也要加¶m11=$j。nginx 没有类似于apache 的修正符。