本文主要是介绍Nginx: 配置项之rewrite模块中的return指令和rewrite指令以及if指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
rewrite模块
主要实现了对 url 的重写
1 )return 指令
- 遇到了 return 指令,会自动停止处理请求,直接返回响应码或重定向到其他 URL
- 执行return指令后,location中后续指令将不会被执行
示例
location / {.....return 404..... # 后面的不会被执行
}
-
return 语法
- return code [text]; 这个测试较多,会被封装到测试体中
- return code URL; 重定向,code 3xx,URL是 /auth 这类
- return URL; 这个URL 是以http/https 开头的
-
默认值: -
-
上下文: server 、location、if
-
HTTP 状态码
- 1xx:消息类
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务器错误
-
重定向 状态码
- HTTP1.0标准
- 301:永久重定向
- 302:临时重定向,禁止被缓存
- HTTP1.1标准
- 303:临时重定向,禁止缓存,允许改变方法
- 307:临时重定向:禁止缓存,不允许改变方法
- 308:永久重定向:不允许改变方法
- HTTP1.0标准
-
配置示例1
server {listen 8080;root html;location / {return 200} }
- 这里只返回一个 状态码,可以这样 $
curl localhost:8000 -I
HTTP/1.1 200 OK Server:nginx/1.17.4 Date: Sat, 19 Oct 2019 07:47:45 GMT Content-Type: application/octet-stream Content-Length: 0 Connection: keep-alive
- 这里只返回一个 状态码,可以这样 $
-
配置示例2
server {listen 8080;root html;location / {return 200 "Success";} }
- Success 会在 body 体里面
-
配置示例3
server {listen 8080;root html;location / {return 302 /bbs;}location /bbs {index bbs.html} }
- 重定向到 /bbs 页面
-
配置示例4
server {listen 8080;root html;location / {return http://xx.xx.xx.xx} }
- 重定向到 /bbs 页面
2 ) rewrite 指令
-
它根据正则匹配规则,重写URL
-
语法:rewrite regex replacement [flag]
-
默认值:-
-
上下文:server、location、if
-
示例:rewrite /images/(.*.jpg)$ /pic/$1; 将images下的jpg文件重写到pic目录下的jpg文件
-
rewrite 指令中的 flag
匹配规则 含义 last 重写后的URL发起新请求,再此进入server段,重试location中的匹配 break 直接使用重写后的URL,不再匹配其他location中语句 redirect 返回302临时重定向 permanent 返回301永久重定向 -
break 和 last 的区别
location /url1 {...rewrite ... break;... }location /url2 {...rewrite ... last; # 重写后的 url 会继续匹配server下的location... }
-
配置示例
server {listen 80;server name www.baidu.com; # 本地host配置的,不是线上的root html;location /search {rewrite ^/(.*) http://www.taobao.com redirect; # redirect 302; permanent 301;}location /images {rewrite /images/(.*) /pics/$1; # /images 下的所有资源,重写到 /pics 下的所有资源}location /pics {# rewrite /pics/(.*)/photos/$1 last; # /pics 下的所有资资源,之后,继续匹配和不加一样# rewrite /pics/(.*)/photos/$1 break; # /pics 下的所有资资源,之后,不再匹配rewrite /pics/(.*)/photos/$1; # /pics 下的所有资资源,重写到 /photos}location /photos {} }
3 )return 和 rewrite 执行顺序
现在测试下两者的执行顺序
-
配置示例1
server {listen 80;server name www.baidu.com; # 本地host配置的,不是线上的root html;location /search {rewrite ^/(.*) http://www.taobao.com redirect;}location /images {rewrite /images/(.*) /pics/$1 last; # 有last 不会执行下面的return, 直接进入到 /picsreturn 200 "return 200 in /images";}location /pics {# 下面是顺序执行的过程rewrite /pics/(.*) /photos/$1; # 这里没有 last 不会立即匹配 /photos, 而会执行下面的 return 语句return 200 "return 200 in /pics";}location /photos {return 200 "return 200 in /photos";} }
-
配置示例2
server {listen 80;server name www.baidu.com; # 本地host配置的,不是线上的root html;location /search {rewrite ^/(.*) http://www.taobao.com redirect;}location /images {rewrite /images/(.*) /pics/$1 last; # 有last 不会执行下面的return, 直接进入到 /picsreturn 200 "return 200 in /images";}location /pics {rewrite /pics/(.*) /photos/$1 break; # 这里是break,下面return 不会执行,直接进入到 /photosreturn 200 "return 200 in /pics";}location /photos {return 200 "return 200 in /photos";} }
- 注意这里,即使 /pics 块中 后面有了 break, 它会跳转到 /photos/xxx
- 但如果访问的路径是images/test.html 或 /pics/test.html, 假设photos/test.html存在,它会返回此文件
- 但如果访问的路径是 /photos/test.html 只会显示 return 200 in /photos,因为 return 指令
- 如果访问的是 /pics 或 /photos, 它会跳转到 下面的 location, 显示 return 200 in /photos
4 )if 指令
-
用于对某一些条件进行判断,比如说可以根据某一些变量的值的不同,对 url 进行一个不同的处理
-
语法:
if(condition) { ... };
-
默认值:-
-
上下文:server、location
-
示例:
# 对客户端浏览器的不同,做不同的处理 if ($http_user_agent ~ Chrome) {rewrite /(.*) /browser/$1 break; }
-
condition 用法
条件 含义 $variable 仅为变量时,值为空或以0开头字符串都会被当做false处理 = 或 != 相等或不等比较 ~ 或 !~ 正则匹配或非正则匹配 ~* 正则匹配,不区分大小写 -f 或 ! -f 检查文件存在或不存在 -d 或 ! -d 检查目录存在或不存在 -e 或 ! -e 检查文件、目录、符号链接等存在或不存在 -x 或 ! -x 检查文件可执行或不可执行
配置示例 rewrite_if.conf,假设我们的Nginx 主机的ip为: 192.168.184.240
server {listen 8080;server name localhost;root html;location /search/ {if ( $remote addr = "192.168.184.1" ) {return 200 "test if OK in URL /search/";}}location / {if ( $uri = "/images" ) {rewrite (.*) /pics/ break;}# return 200 'test if failed';}
}
再建立 两个文件
search/index.html
URL /search/ index page
pics/index.html
URL /images in /pics
- ip为:192.168.184.2 的主机访问:curl 192.168.184.240:8080/search/, 返回 search/index.html
URL /search/ index page
- ip为:192.168.184.1 的访问:curl 192.168.184.240:8080/search/, 返回
test if OK in URL /search/
- 访问 curl 192.168.184.240:8080/images/, 返回
URL /images in /pics
- 当放开下面的注释 return 200 ‘test if failed’; 则会返回
test if failed
- 因为 if 下,会执行下面的 return
- 当放开下面的注释 return 200 ‘test if failed’; 则会返回
这篇关于Nginx: 配置项之rewrite模块中的return指令和rewrite指令以及if指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!