一、if
条件判断,并根据结果选择不同的nginx配置
可以在server块,location块使用
语法:
if (condition) {
...
}
其中:
condition:判断条件,包括:
nginx内置变量
=,!=: 判断变是否相等
正则表达式: ~(区分大小写),~*(不区分大小写),!~(~取反),!~*(~*取反)
-f,!-f: 文件时是否存在
-d,!-d: 目录是否存在
-e,!-e: 目录或文件是否在使用
-x,!-x: 文件是否可执行
示例
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
二、break
break
跳出当前作用域,回到上一层继续向下,与break同级且位于后面的会被忽略
可以在server块,location块,if块中使用
示例
if ($slow) {
limit_rate 10k;
break;
}
三、return
停止处理请求,直接向客户端返回响应状态码,
执行return指令后,同一级中后面的指令都会无效
可以在location块,server块,if块中使用,return指令比rewrite指令简单高效,尽量使用return
语法:
return code;
return code [text];
return code URL;
return URL;
其中:
code:返回给客户端的状态码
第一个语法中的code包含所有的http状态码
第三个语法中的code包含:
301:永久重定向
302:临时重定向
303:临时重定向,应使用GET方法定向获取请求的资源
307:临时重定向
308:永久重定向
text:返回给客户端的响应体内容,支持nginx内置变量
URL(统一资源定位符):重定向后返回给客户端的URL地址
示例
1 返回状态码
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
return 403;
}
}
2 返回状态码和响应体内容
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
return 200 'Status Code:200';
}
}
使用谷歌浏览器访问会下载包含响应体内容的文本
3 重定向至其他URL
server {
listen 80;
server_name localhost;
charset utf-8;
location ^~ /web/ {
root /usr/share/nginx/html;
index index.hmtl index.htm;
}
location / {
return 301 /web/;
}
使用谷歌浏览器访问ip:80会重定向到ip:80/web/
4 不加状态码重定向到其他URL
server {
listen 80;
server_name localhost;
charset utf-8;
location ^~ /web/ {
root /usr/share/nginx/html;
index index.hmtl index.htm;
}
location / {
return $scheme://主机ip:80/web/;
}
使用谷歌浏览器访问ip:80会重定向到ip:80/web/
四、rewrite
根据匹配的正则表达式,重写URL
可以同时存在一个或多个rewrite指令
可以在location块,server块,if块中使用
rewrite接收的URI不包括host地址,即访问http:ip:port/test/,rewrite会接受到/test/;
也不包括请求指令,即访问http:ip:port/test/?a=1&b=3,rewrite会接受到/test/
语法:
rewrite regex replacement [flag]
其中
regex:用于匹配URI(通用资源标识符)的正则表达式,可以使用"()"来标记要截取的内容
replacement:用于替换匹配成功后的URI的字符串,支持nginx内置变量
flag:用于设置rwrite对URI的处理行为,包含:
last:终止本location块,将重写后的URI使用各location块再次进行处理,一般使用在server块和if块
break:使用重写后的URL在本location块中继续处理,一般使用在location块
redirect:将重写后的URI返回给客户端,状态码为302,指明临时重定向
permanent:将重写后的URI返回给客户端,状态码为301,指明永久重定向
示例
1 域名跳转,重写至www.baidu.com
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
rewrite '^/test/' http://www.baidu.com ;
}
使用谷歌浏览器访问ip:80/test/,实际访问http://www.baidu.com
2
server {
listen 80;
server_name localhost;
charset utf-8;
location ^~ /web/ {
root /usr/share/nginx/html;
index index.hmtl index.htm;
}
location / {
rewrite '^/([a-z]{3})/(.*)' /web/$1/$2 permanent;
}
其中$1表示引用前面的([a-z]{3}),$2表示引用前面的'(.*)'
使用谷歌浏览器访问ip:80/aaa/xxx,实际访问http://ip:80/web/aaa/xxx