【转】nginx rewrite last和break区别
last 一直会继续往下匹配,直到 “last”---->最后。。。
break------ 到这里就中断了,break出去了。。。
测试目录:/work/code/src/frontend/nginx2
测试命令: docker run --name nginx2 -v /work/code/src/frontend/nginx2/nginx.conf:/etc/nginx/nginx.conf -v /work/code/src/frontend/nginx2/site1/:/usr/share/www -p 9000:9000 -d nginx
------------------------------------------------------------------------
build.sh
1 2 3 4 5 6 7 | #!/bin/bash if [ -f "./Dockerfile" ]; then rm -f ./Dockerfile fi echo "FROM nginx:latest" >> ./Dockerfile echo "COPY ./dist /cpy/test-micro/base-dist" >> ./Dockerfile echo "COPY ./conf/nginx.conf /etc/nginx/" >> ./Dockerfile |
docker build -t mynginx:v1 .
docker run --name ssnginx -p 7007:7007 -v /work/code/src/frontend/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -d mynginx:v1
--------------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | worker_processes auto; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ; access_log / var /log/nginx/access.log main; sendfile on ; #tcp_nopush on; keepalive_timeout 65; gzip on ; server { listen 9000; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; root /usr/share/www/site1; location / { index index.html index.htm; } # 请求重定向测试 location /rewrite { add_header Content-Type 'text/html; charset=utf-8' ; return 200 'message in rewrite' ; } # last location /last { add_header Content-Type 'text/html; charset=utf-8' ; rewrite ^/last /rewrite last; } # break location / break { add_header Content-Type 'text/html; charset=utf-8' ; rewrite ^/ break /rewrite2 last; #这里如果是 break , 就看不到下面的 message in rewrite2了。 而是404------------------------------------++++++++++++++++++++++++++++++++++============================== # rewrite ^/break http://iot.vidagrid.com break; } location /rewrite2 { add_header Content-Type 'text/html; charset=utf-8' ; return 200 'message in rewrite2' ; } # 临时重定向 location /redirect { add_header Content-Type 'text/html; charset=utf-8' ; rewrite ^ http: //www.crane.run redirect; } # 永久重定向 location /permanent { add_header Content-Type 'text/html; charset=utf-8' ; rewrite ^ http: //www.crane.run permanent; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } } |
原文:https://www.cnblogs.com/nonsec/p/13304147.html
参考:https://www.freesion.com/article/5608717826/
---------------------
nginx rewrite last和break区别
last 停止rewrite,如果没有匹配到,会继续向下匹配,如果匹配到,会重新发起匹配
break 停止rewrite,如果没有匹配到,则不会向下匹配,返回404
root /www
location /break/ { default_type text/html; rewrite ^/break/(.*) /test/$1 break; } location /last/ { default_type text/html; rewrite ^/last/(.*) /test/$1 last; return 200 "last page"; } location /test/ { default_type text/html; return 200 "test page"; }
对于http://localhost/break/abc.html,如果/www/test目录下不存在abc.html,会返回404错误
对于http://localhost/last/abc.html,会重新发起新请求,去匹配/test/$1即http://localhost/test/abc.html,会返回test page
--------------------------------------------------
本文使用之前制作的Docker容器<<Docker案例:搭建nginx服务>>演示Nginx四种重写类型的区别和效果,如果尚未构建Docker服务可参考之前的文章,或者自建Nginx服务。
1 NGINX重写简介
Nginx重写功能(Rewrite)由ngx_http_rewrite_module
模块提供,可使用正则表达式改变请求的URI,返回重定向地址或内容,并可以根据条件选择适当的配置。
1.1 REWRITE指令格式
重写指令格式如下:
# 关键字 正则表达式 代替的内容 重写类型
rewrite regex replacement [flag]
- 1
- 2
1.2 重写类型
Nginx重写类型 [flag]
有last
、break
、redirect
和permanent
四种,如下:
last
:本条重写规则匹配完成后,终止匹配后续重写规则,并重新发起请求继续匹配新的location URI规则;浏览器地址栏URL地址不变break
:本条重写规则匹配完成后,终止匹配后续重写规则; 浏览器地址栏URL地址不变redirect
:返回302临时重定向,浏览器地址会显示重写后的URL地址permanent
:返回301永久重定向,浏览器地址会显示重写后的URL地址
1.3 重写配置
为了演示四种重写类型的不同,在nginx的配置中添加/last
、/break
、/redirect
、/permanent
、/rewrite
五个路由地址,完整配置如下:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
root /usr/share/www/site1;
location / {
index index.html index.htm;
}
# 请求重定向测试
location /rewrite {
add_header Content-Type 'text/html; charset=utf-8';
return 200 'message in rewrite';
}
# last
location /last {
add_header Content-Type 'text/html; charset=utf-8';
rewrite ^/last /rewrite last;
}
# break
location /break {
add_header Content-Type 'text/html; charset=utf-8';
rewrite ^/break /rewrite break;
# rewrite ^/break http://www.crane.run break;
}
# 临时重定向
location /redirect {
add_header Content-Type 'text/html; charset=utf-8';
rewrite ^ http://www.crane.run redirect;
}
# 永久重定向
location /permanent {
add_header Content-Type 'text/html; charset=utf-8';
rewrite ^ http://www.crane.run permanent;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
配置完成后,由于nginx服务在docker容器中,所以需要重新加载docker容器内nginx服务的配置,在宿主机执行如下docker指令:
docker exec -it nginx nginx -s reload
- 1
2 请求测试
下面通过浏览器访问相关地址来测试上面几种重写类型。
2.1 LAST
访问 http://localhost:8880/last,如上一步中的配置,请求重写到/rewrite
路由,如下图:
实际上重写规则匹配成功之后,nginx又根据重写路由发起了一个新的请求,并返回新请求的返回结果当做初始请求的结果
2.2 BREAK
访问 http://localhost:8880/break,如上一步中的配置,请求重写到/rewrite
路由,如下图。
实际上重写规则匹配成功之后,不再发起新的请求,也就不存在重新匹配location的过程,所以重写的
/rewrite
路由对于当前请求来讲是个不存在的资源;假如重写的资源存在,例如替换为可访问的网络地址,则请求是成功的
2.3 REDIRECT
访问 http://localhost:8880/redirect,如上一步中的配置,Nginx返回302
临时重定向状态码重定向到指定地址。浏览器地址变成重定向后的新地址。如下图:
2.4 PERMANENT
访问 http://localhost:8880/permanent,如上一步中的配置,Nginx返回301
永久重定向状态码重定向到指定地址。浏览器地址变成重定向后的新地址。如下图:
2.5 停止NGINX服务
停止docker容器的nginx服务,指令如下:
docker stop nginx
- 1
停止nginx服务后,重新访问http://localhost:8880/redirect
和http://localhost:8880/permanent
效果如下图:
3 总结
通过上面的验证,结合官方文档,可见几种重写的区别:
break与last都停止处理后续重写规则,只不过last会重新发起新的请求并使用新的请求路由匹配location,但break不会。所以当请求break时,如匹配成功,则请求成功,返回200;如果匹配失败,则返回404。
服务器配置好redirect和permanent之后,打开浏览器分别访问这两个请求地址,然后停止Nginx服务。这时再访问redirect请求会直接报出无法连接的错误。但是permanent请求是永久重定向,浏览器会忽略原始地址直接访问永久重定向之后的地址,所以请求仍然成功。(这个验证不能禁用浏览器的缓存,否则即使是permanent重定向,浏览器仍然会向原始地址发出请求验证之前的永久重定向是否有效)
对于搜索引擎来说,搜索引擎在抓取到301永久重定向请求响应内容的同时也会将原始的网址替换为重定向之后的网址,而对于302临时重定向请求则仍然会使用原始的网址并且可能会被搜索引擎认为有作弊的嫌疑。所以对于线上正式环境来讲,尽量避免使用302跳转
如果replacement以”http://”或”https://”或“$scheme”开始,处理过程将终止,并将这个重定向直接返回给客户端。
4 参考
[1] 搞懂nginx的rewrite模块
[2] 官方Rewrite文档
[3] 301和302对SEO的影响
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2020-12-01 【转】go编译时,加入svn版本信息
2020-12-01 tmux新版本配置有点不一样
2016-12-01 git 查看当前与上一次version的差异