【转】nginx rewrite last和break区别 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

#!/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

 

 

 

 

--------------------------------------------------------------------------

 

 

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] 有lastbreakredirectpermanent四种,如下:

  • 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/redirecthttp://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的影响

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章