Nginx系列-8 allow与deny和error_page使用介绍
1.allow与deny介绍
allow和deny发生在access阶段,用于控制对资源的访问权限;allow表示允许访问,deny限制访问。
配置方式为:
#允许192.168.100.124访问
allow 192.168.100.124;#允许192.168.100.124/24地址段(192.168.100.0~192.168.100.255)访问
allow 192.168.100.124/24;#允许所有IP访问
allow all;
deny用法与allow完全相同。
说明: allow和deny针对于IP和IP段而言,不能配置域名。
2.案例介绍
一般,可以将allow/deny配置在http块、server块、location块中。
请求会按照优先级顺序自上而下进行匹配,匹配一个就中断。以下通过案例的方式进行介绍:
执行匹配的第一个:
server {listen 8001;server_name localhost;allow 192.168.0.1; #第1条deny 192.168.0.2; #第2条allow 192.168.0.3; #第3条deny all; #第4条allow 192.168.0.4; #第5条allow all; #第6条# ...
}
当192.168.0.1访问时,匹配第1条,允许访问,即192.168.0.1可穿过access阶段;
当192.168.0.2访问时,匹配第2条,被拦截,返回403;
当192.168.0.3访问时,匹配第3条,允许访问,即192.168.0.3可穿过access阶段;
其他IP访问时,按照从上到下的顺序,匹配第4条,拒绝所有,返回403;
此时,第5条河第6条失效。
location块与server块的优先级:
server {listen 8001;server_name localhost;deny all;location /query {allow all;content_by_lua 'ngx.say("query")';}location /ask {content_by_lua 'ngx.say("ask")';}
}
测试结果如下:
[root@node52 conf]# curl http://localhost:8001/query
query[root@124 conf]# curl http://localhost:8001/ask
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>openresty/1.25.3.1</center>
</body>
</html>
当访问/query块时,由于location /query块中添加了allow all
指令该指令优先级高于server块中定义的deny all
, 匹配后,不再执行其他allow/deny指令,因此该请求穿过access阶段。
当访问/ask块时, 执行server块中定义的deny all
指令,被拒绝访问,返回403。
3.error_page配置
error_page用于处理异常场景,可为不同的错误码配置不同的处理策略。error_page指令使用方式为error_page ${code} ${custom-code} ${url}
, 案例如下:
error_page 500 501 502 =200 /50x.htmllocation = /50x.html {root html;
}
其中: code 表示匹配处理的异常,如需匹配多个异常类型,用空格分开,此时匹配500/501/502三种异常; custom-code 表示自定义HTTP响应码,此时返回给客户端的HTTP状态码为200; url为重定向的路径,此时重定向至/50x.html
路径。
url可以使用相对路径,也可使用绝对路径,如:
error_page 500 501 502 =200 http://www.baidu.com
url可以用路径,也可使用具名location, 如下所示:
error_page 404 403 404 @jump_to_50x;location @jump_to_50x {return 404 'Not Found';
}
error_page指令可以在http块、server块、location块中使用,优先级越靠内越高,即location会覆盖server,server会覆盖http。如下所示:
http { error_page 404 /global-404.html; # 全局配置 server { listen 8080;server_name localhost; error_page 404 /server-404.html; # server级别配置 location /foo { error_page 404 /location-404.html; # location级别配置 } location /bar { # 这里没有为404定义error_page,所以会回退到server级别或全局级别 } }
}
当访问http://localhost:8080/bar时,返回 /server-404.html响应结果;/foo对应/location-404.html,其他路径对应/global-404.html。