快3网上购买

module探寻nginx的rewrite模块的break和last差异

电脑杂谈  发布时间:2019-09-03 08:04:47  来源:网络整理

nginx rewrite last_nginx rewrite last_rewrite nginx

安装 echo-nginx-module 模块到 nginx 上,安装方式可见我的这篇文章:为即将安装好的nginx动态添加新组件echo-nginx-module

阅读本文者应当对怎样设置 nginx 的配置文件或者怎么重启 nginx 使其应用新的配置文件有所了解,并且对 server 和 location 这两个基本的模块有所了解。

对break和last的提问

由于官方资料有着绝大多数高手写的文档的毛病——有些对于新手应该表明的东西在高手脑子里早已不言自明,所以就自然地没写。所以现在寻找主要基于”对break和last的回答“这篇中的第二个回答有所改动。

备份正在被使用的 nginx 的配置文件:cp your-nginx-rootpath/conf/nginx.conf your-nginx-rootpath/conf/nginx.conf.bak

对nginx。conf动工:注释掉所有正在工作的server组件,确保我们以后添加的用来检测的server组件是唯一可用的server块。

添加如下代码到配置文件中适合的位置。

server {
    server_name localhost;
    root 'html';
    
    location =/example.txt {
        return 404;
    }
    location / {
        echo 'finally matched location /';
    }
    location /notes {
        echo 'finally matched location /notes';
    }
    location /documents {
        echo 'finally matched location /documents';
    }
    rewrite ^/([^/]+.txt)$ /notes/$1;
    rewrite ^/notes/([^/]+.txt)$ /documents/$1;
}

nginx rewrite last_rewrite nginx_nginx rewrite last

保存对配置文件的更改后,重启 nginx 以确保 nginx 使用新的配置文件。这一行的操作在每次更改nginx的配置文件后都应该完成,但后来不再复述。

在命令行中键入:curl localhost/example.txt

命令行输出:finally matched location /documents

我觉得从中可以得到下面信息:

rewrite模块或者说 ngx_http_rewrite_module 模块的指令会先于 location 块的匹配执行,而不是在server内部根据排序执行,否则需要遇到location =/example.txt就直接输出finally matched location =/example.txt了(echo-nginx-module在同一个请求的两次echo中,后一次echo并不会覆盖掉前一次echo,而是两次echo均输出)。如果没有 flag 参数, 默认的 rewrite 模块的指令会按次序不断执行到全部执行完(URI不符合rewrite要求的正则表达式则跳过该条本质上也有执行了该条),然后去执行权重较低的指令(比如这里的location模块的匹配)。

在rewrite ^/([^/]+.txt)$ /notes/$1;后添加break或break作为 flag 参数。

添加break还是last,命令行中键入curl localhost/example.txt,得到的结果都是finally matched location /notes

官方文档对last参数的表述如下:

nginx rewrite last_rewrite nginx_nginx rewrite last

stops processing the current set of ngx_http_rewrite_module directives and starts a search for a new location matching the changed URI;

翻译过来就是说:停止当前层级的 rewrite 模块的指令,然后开始为修改后的URI寻早合适的 location 块进行匹配。

从结果上来看是很符合要求的。

官方文档对于break参数的表述如下:

stops processing the current set of ngx_http_rewrite_module directives as with the break directive;

说它就和break指令一样,同时在原文中对 break 一次是加了超链接的,跳转过去后表明如下:

Stops processing the current set of ngx_http_rewrite_module directives.

If a directive is specified inside the location, further processing of the request continues in this location.

rewrite nginx_nginx rewrite last_nginx rewrite last

同样也有停止 rewrite 模块的其他指令,但是并没有像 last 参数说会去搜寻匹配的 location 块。那就没法根据我第一次测试时的理解来说了,因为这种说得通——rewrite模块的指令的权重是超过 location 块(指令)的nginx rewrite last,所以 rewrite 模块的相关指令都是先于 location 块(指令)执行,即使位置在 location 块(指令)之下。这里 break 参数停止了以后的 rewrite 模块的所有指令,但是 location 块(指令)不属于 rewrite 模块,在 rewrite 模块的指令被结束后就自然而然地执行了。

这次我们把 rewrite 的指令移动到 location =/example。txt 块中,先不加任何 flag 参数,如下:

server {
    listen  80 default_server;
    server_name localhost;
    location =/example.txt {
        rewrite ^/([^/]+.txt)$ /notes/$1;
        rewrite ^/notes/([^/]+.txt)$ /documents/$1;
        return 404;
    }
    location / {
        echo 'finally matched location /';
    }
    location /notes {
        echo 'finally matched location /notes';
    }
    location /documents {
        echo 'finally matched location /documents';
    }
}

仍旧curl localhost/example.txt,返回结果是404页面了

<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

这很高解释,因为没有带 flag 参数,rewrite 模块的指令执行完了就再次执行 retrun 那一行的指令,然后return 霸道无比的直接结束了所有后续,返回了404页面。

然后为rewrite ^/([^/]+。txt)$ /notes/$1;添加 break 或 last 参数后重新检测,看看结果会怎样。

命令行输入:

rewrite nginx_nginx rewrite last_nginx rewrite last

curl localhost/example.txt

结果:

<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

命令行输入:

curl localhost/example.txt

结果:

finally matched location /notes

结果感受到这儿,相信你们也知道了,正如官方文档对break指令描述所说,break指令不会终止" further processing ",而last则会马上为修改后的URI寻找匹配,相当于从头开始传入一个新的UIRnginx rewrite last,那么它所在的 location 块中其前面的指令就都无效了。


本文来自电脑杂谈,转载请注明本文网址:
http://www.kadakong.com/a/jisuanjixue/article-121534-1.html

    相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    快3投注网 博盈彩票登陆 快3娱乐平台 微信pk10机器人漏洞 快三网上投注 万发彩票开奖 冠军彩票APP 迪士尼彩乐园娱乐 湖南快乐十分走势 上海11选5计划