南京网站建设一条龙seo搜索引擎优化试题及答案
个人结论:
1.server层ngx_http_rewrite_module模块相关指令按照配置顺序依次执行;
2.server层执行完break指令后,该层级所有跟ngx_http_rewrite_module模块相关的指令都不再被执行,但是不影响其他模块(例如:https://zhuanlan.zhihu.com/p/357272929 的例子
location = /testbreak {break;return 200 $request_uri;proxy_pass http://127.0.0.1:8080/other;}
,return也属于这块模块,但是之后跟上的proxy_pass 这并不属于这个模块,所以会生效,最终回到/other),但不影响location层ngx_http_rewrite_module模块相关指令的继续执行,所以请求处理过程会继续向下;
3.location层执行完break指令后,当前server所有层级跟ngx_http_rewrite_module模块相关的指令都不再被执行(换言之就是,最终URI就这吧,别再找了),nginx根据最终请求路径将请求结果返回给客户端;
4.无论在哪个层级执行完return指令后,请求处理过程都会立刻终止并将指定的code、重定向URL或响应正文文本返回给客户端。
5.虽然Nginx在循环重写过程中最多是可以执行11次循环,但在第11次循环中执行rewrite后会抛500异常,所以严格意义上来说,正常情况下Nginx请求重写循环过程最多就是10次。强烈建议亲自做下测试10。
6.rewrite regex /xxx break指令与单独break指令的中断效果一样,用IF语句满足匹配条件之后,执行rewrite regex /xxx,再执行break,估计效果相同。
7.rewrite regex /xxx last指令是执行完重写后,立即开始(下一轮)匹配location,server层或当前location层其它指令不再执行。
例子暂时先这样:
server {listen 80;server_name www.cjlnginx.com;root /tmp/cjl;index 1.txt;port_in_redirect off;location = /6.txt {rewrite ^ /7.txt;#因为7.txt没有匹配location了,接下来没>
有匹配rewrite了,所以虽然没有break但还是定格在7.txt}location = /3.txt {rewrite ^ /5.txt;rewrite ^ /6.txt last;#此处如果是break就显示6,last的话,
那么就会重新筛选从头代入location.也就是上面的7.txt.中断了下面的rewrite,如果
这条是最后一条的话(注释下面这条),即使不加last,也会新筛选从头代入location.所
以last的作用,感觉就是结束后续的rewrite模块.rewrite ^ /8.txt; #如果上面有标志,这个8.txt就不会执行,>
如果flag不填的话,则会顺序下来.}location = /2.txt {rewrite ^ /1.txt;#注意这里会继续到rewrite那了,如果break
直接就是1.txt}rewrite ^(/3.txt)$ /2.txt;#顺序执行下去3->2,2->5,5->2rewrite ^(/1.txt)$ /3.txt last;#break一样的效果,都会进入locat
ion,rewrite ^(/3.txt)$ /4.txt;rewrite ^(/2.txt)$ /5.txt;rewrite ^(/5.txt)$ /2.txt;#如果此处没有被,location = /2.txt捕
获或者在末尾加上break,就会死循环.rewrite ^(/6.txt)$ /9.txt break;#rewrite ^(/7.txt)$ /4.txt;#如果打开这个和下面这条,你会发现又
回到rewrite了#rewrite ^(/4.txt)$ /9.txt break;location ~ /6.txt { #这里不会进入,前面有= /6.txt 一直给拦截了
了,所以这里不会执行到rewrite ^ /8.txt;}}
请求http://www.cjlnginx.com/1.txt 和http://www.cjlnginx.com/3.txt 看看结果.就能摸索出来.