本篇介绍在Nginx服务下使用伪静态,重写Url规则。以另一篇文章Apache服务下的伪静态设置为例讲解说明。
真实Url为 http://www.abc.com/index.php?m=content&c=news&a=list&id=10,将其设置为伪静态URL http://www.abc.com/news/list/10.html。
先看下对应文章中Apache环境下的.htaccess文件重写的url规则:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^news/list/([0-9]+)/$ index.php?m=content&c=index&a=lists&catid=$1&page=1
RewriteRule ^news/list/([0-9]+)/([0-9]+)\.html$ index.php?m=content&c=index&a=lists&catid=$1&page=$2
Nginx实现相同Url伪静态功能的rewrite规则为:
location / {
root D:/web/www;
index index.html index.php index.htm;
#站点的rewrite,设置伪静态
if (!-f $request_filename){
rewrite ^/news/list/([0-9]+)/([0-9]+).html /index.php?m=content&c=index&a=lists&catid=$1&page=$2 last;
rewrite ^/news/list/([0-9]+)/ /index.php?m=content&c=index&a=lists&catid=$1&page=1 last;
}
}
上例中要注意的是,第二个rewrite规则一定要放在后面,原因:
当访问 /news/list/2/ 时,只有一个参数$1,对应index.php?m=content&c=index&catid=2&page=1;
当访问 /news/list/3/4.html 时,有两个参数$1和$2,真实url本应为index.php?m=content&c=index&catid=3&page=4;但形式上也符合只有一个参数的 index.php?m=content&c=index&catid=2&page=1。
Nginx按照顺序优先原则,会优先和这个真实url做映射,因而会然把所有访问都映射到 page=1 的情况。
为了精确映射,要先匹配有两个参数的情况,再匹配只有一个参数的情况。故把参数多的rewrite规则放前面。
在Nginx环境下重写url规则,有几个不同点要注意:
- 重写的url都要以“/”开头,相应后面的真实url也要以“/”开头;
- Apache中重写的url以“$”作为结尾,Nginx中一般不需要结尾符、碰到空格就是重写url的结束;
- 每个rewrite语句要以 “last;”结尾,重写的url、真实url、last之间用一个空格隔开;
- url伪静态的正则表达式通用。