nginx配置之if,break,return,rewrite

 一、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

 

posted @ 2021-02-06 17:06  junffzhou  阅读(3747)  评论(0编辑  收藏  举报