快捷搜索:  汽车  科技

nginx 支持rewrite 功能(Nginx的Http请求11个阶段之rewrite阶段)

nginx 支持rewrite 功能(Nginx的Http请求11个阶段之rewrite阶段)可以出现的范围http server location iferror_page的意思实际上是 当收到某一个返回码的时候,可以重定向为另外一个uri 也可以指定给用户返回不一样的内容。表示Nginx立刻关闭连接,不再向用户返回任何内容。/* Our own HTTP codes */ /* The special code to close connection without any response */ #define NGX_HTTP_CLOSE 444 #define NGX_HTTP_NGINX_CODES 494 #define NGX_HTTP_REQUEST_HEADER_TOO_LARGE 494 #define NGX_HTTPS_CERT_ERROR 495 #define NGX_HTTPS_NO_CERT 496return指令与error_pa

rewrite模块中如果执行了 return指令,那么后面的阶段都没有机会执行。

那么return指令的语法是怎么样的?

主要有3种:

return code [text]; return code URL; return URL;

444 这个状态码,浏览器是收不到这个code的。这是Nginx自定义的状态码。

表示Nginx立刻关闭连接,不再向用户返回任何内容。

/* Our own HTTP codes */ /* The special code to close connection without any response */ #define NGX_HTTP_CLOSE 444 #define NGX_HTTP_NGINX_CODES 494 #define NGX_HTTP_REQUEST_HEADER_TOO_LARGE 494 #define NGX_HTTPS_CERT_ERROR 495 #define NGX_HTTPS_NO_CERT 496

return指令与error_page

nginx 支持rewrite 功能(Nginx的Http请求11个阶段之rewrite阶段)(1)

我们经常用看到Nginx配置中有error_page。

error_page的意思实际上是 当收到某一个返回码的时候,可以重定向为另外一个uri 也可以指定给用户返回不一样的内容。

可以出现的范围http server location if

常见案例:404页面,找不到该页面的时候,我们想返回给用户一些用户体验较好的页面,比如寻找走失儿童或者保护环境等。

nginx 支持rewrite 功能(Nginx的Http请求11个阶段之rewrite阶段)(2)

rewrite指令

语法:

rewrite regex replacement [flag];

作用:

1. 匹配上正则表达式regex的url 替换成replacement(新的url ) flag 是表示行为。

2. 当replacement以http:// 或 https://或 $schema开头,则直接返回302重定向

3. 替换后的url根据flag指定的方式进行处理

flag 的选项:

--last:用replacement这个新的URI 重新在我们的location中进行匹配。

--break: break指令停止当前脚本指令的执行。

--redirect:返回302重定向

--permanent:返回301重定向

为了巩固一下 我们来看一个例子:

html下有3个目录 并放入3个文件。内容分别是 test1 test2 test3。

cd html mkdir first second third echo "test1" > html/first/1.txt echo "test2" > html/second/2.txt echo "test3" > html/third/3.txt

nginx.conf如下

server { server_name rewrite.local.com; rewrite_log on; error_log logs/rewrite_error.log notice; root html/; location /first { rewrite /first(.*) /second$1 last; return 200 'first!\n'; } location /second { rewrite /second(.*) /third$1; return 200 'second!\n'; } location /third { return 200 'third!\n'; } }

此时 我们请求会返回什么呢?

curl return.local.com/first/3.txt

结果是

nginx 支持rewrite 功能(Nginx的Http请求11个阶段之rewrite阶段)(3)

原因是因为

在匹配到/first的时候 被rewrite 成了second flag是last,就到上层去重新匹配了。

此时匹配到了第二个location /second 进来又被rewrite了,但是没有last 也没有break。于是继续执行return 200 'second!\n';

在第二个location里都已经return了。 第三个location就没有机会执行了。

那么我们再变化一下将第二个location变成以下

location /second { rewrite /second(.*) /third$1 last; return 200 'second!\n'; }

此时 我们请求会返回什么呢?

curl return.local.com/first/3.txt

结果是

nginx 支持rewrite 功能(Nginx的Http请求11个阶段之rewrite阶段)(4)

这个想必大家都知道结果了。最后被匹配到第三个location里了。

那么我们再变化一下将第二个location变成以下 区别一下break和 last的区别

location /second { rewrite /second(.*) /third$1 break; return 200 'second!\n'; }

此时 我们请求会返回什么呢?

curl return.local.com/first/3.txt

结果是

nginx 支持rewrite 功能(Nginx的Http请求11个阶段之rewrite阶段)(5)

这是因为在location /second里被rewrite后,flag为break 就不执行下面的return; 也不返回重新匹配localtion 而是停止了 直接请求third/3.txt了。

nginx 支持rewrite 功能(Nginx的Http请求11个阶段之rewrite阶段)(6)

好了,今天就先到这里了,明天我们继续学习http请求处理的 find_config阶段。

猜您喜欢: