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