一篇文章说透Nginx的rewrite模块 (2)

-x /path/to 检验文件是否为可执行文件;!-x /path/to 检验文件是否为不可执行文件

if 指令举例 if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } location /xiao/ { if ($http_user_agent ~ Mozilla/5.0) { #如果是chrom浏览器 rewrite ^(.*)$ ; #返回客户端302 } if ($http_user_agent ~ curl) { # 如果是curl 发起请求 rewrite ^/xiao/(.*)$ /xiao/$1.txt break; #得到新的URI } } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; #提取了变量$1 } if ($request_method = POST) { return 405; #可以限制Request Method } if ($slow) { limit_rate 10k; #这个配置会加在location里面 } if ($invalid_referer) { return 403; } return

基本语法:return code [text];或者return code URL;或者return URL;
上下文:server, location, if

停止任何的进一步处理,并且将指定状态码返回给客户端。如果状态码为444(此状态码是非标准的),那么直接关闭此TCP连接。

return的参数有四种形式:

return code 此时,响应内容就是nginx所默认的,比如503 Service Temporarily Unavailable; 如果是444那就直接关闭TCP连接,也可以是其他值(644等),但是没啥意义

return code text 因为要带响应内容,因此code不能是具有跳转功能的30x

return code URL 此时URI可以为URI做内部跳转,也可以是具有“”或者“https://”等协议的绝对URL,直接返回客户端,而code是30x(301, 302, 303, 307,308)

return URL 此时code默认为302,而URL必须是带“”等协议的绝对URL

set

基本语法:set $variable value;
上下文:server, location, if

这是一个有用的指令,用来定义变量,变量的值可以包含字符串,另外的变量或者是二者结合。

set $var = $http_x_forwarded_for;

注意:在Nginx中,除非特殊说明,大部分地方字符串的不需要引号括住,字符串和变量的拼接也不需要引号

rewrite_log

基本语法:rewrite_log on | off;
上下文:http, server, location, if

如果开启 on,那么当发生rewrite时,会产生一个notice级别的日志;否则不会产生任何日志。默认情况下是不产生的,但在调试的时候可以将其置为on。

以上这些指令,基本涵盖了rewrite模块的所有应用,在需要改写请求URI,或者做跳转时非常有用。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxxzz.html