介绍rewrite之前先说一下一些相关的操作指令。
if指令用来支持条件判断,其语法结构如下:
if (condition) {...}
{…}中的为满足条件时要执行的配置设置。
if指令可存在于server块和location块中,可以使用以下符号进行比较判断:
= 等于
!= 不等于
~ 大小写敏感的模糊匹配
~* 大小写不敏感的模糊匹配
-f 请求的文件是否存在
-d 请求的目录是否存在
-e 请求的文件或目录是否存在
-x 请求的文件是否可执行
每个操作具有"非"权限,如"!~"、"!-f"等
例如判断用户的浏览器是否为IE(比较新的IE版本已经匹配不到了),则可以使用以下方式:
if ($http_user_agent ~ MSIE) {...}
根据用户请求方式的不同而使用不同的配置:
if ($request_method = GET) {...}
if ($request_method = POST) {...}
break指令可存在于server块、location块、if块中,作用是直接跳出当前作用域,在存在break的作用域中,break之前的配置生效,break之后的配置将不会生效。
return指令用于完成对请求的处理,直接向客户端返回相关信息,处于该指令后的nginx配置都是无效的,该指令可用于server块、location块、if块中。
支持以下语法结构:
return [text] #返回给客户端的响应体内容,可使用变量
return code URL; #返回给客户端的HTTP状态码
return URL; #返回给客户端的URL地址
rewrite指令是实际用来进行rewrite功能配置的具体指令,使用正则表达式的方法来改变URI,可同时存在1个或多个指令,按照顺序依次进行处理。
rewrite指令可以在server块或location块中进行配置,语法结构如下:
rewrite regex replacement [flag];
参数说明:
regex:正则表达式,使用()标记要截取的内容,使用$1~$9获取截取到的内容;
replacement:匹配成功后用于替换被截取内容的字符串,即重写后的地址,如果该字符串是由http(s)开头的,则直接返回此URI给客户端,不再继续向下处理。
flag:设置rewrite对URI的处理行为,有4种标志可设置,分别为:
last:终止继续在本location块中处理URI,将重写后的URI重新在server块中执行,提供了重写后的URI转入到其它location块中的机会;
break:重写后的URI继续在本location块中执行,不会转入到其它的location块中;
redirect:重写后的URI返回给客户端,状态代码为203,指明是临时重定向URI,主要用在replacement不是以http(s)开头的情况下;
permanent:重写后的URI返回给客户端,状态代码为301,指明是永久重定向URI;
set指令用来设置新的变量,语法结构如下:
set $variable value
下面来看一些具体的例子:
例1
server {
listen 7777;
if ($http_user_agent !~ MSIE) {
rewrite ^/ http://10.0.0.33/Api$uri;
}
}
$uri
是全局变量,与$document_uri
含义相同,截取的都是host后的部份。
chrome访问”http://10.0.0.1:7777/a.php?num=99“,会被rewrite成”http://10.0.0.33/Api/a.php?num=99“。
例2
server {
listen 7777;
if ($request_method = GET) {
rewrite ^/ http://10.0.0.33/get$uri;
}
}
访问”http://10.0.0.1:7777/a.php?cc=9c9c“,会被rewrite成”http://10.0.0.33/get/a.php?cc=9c9c“。
例3
server {
listen 7777;
location ^~ /Api
{
rewrite ^/Api(.*) http://10.0.0.33/mapi$1;
}
location ^~ /User
{
rewrite ^/User(.*) http://10.0.0.33/ss$1;
}
}
使用http://10.0.0.1:7777/Api/a.php进行请求访问,会被重写为http://10.0.0.33/mapi/a.php。同样,使用http://10.0.0.1:7777/User/b.php进行请求访问,会被重写为http://10.0.0.33/ss/b.php。