背景
在Nginx系列1-7中陆续介绍了nginx常见的指令,这里对遗漏的指令进行收集,包括allow与deny、error_page的使用、set和变量、if指令的使用等。
本文内容后续将保持更新状态.
1.allow与deny
1.1 使用方式
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段而言,不能配置域名。
1.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。
2.error_page配置
error_page用于处理异常场景,可为不同的错误码配置不同的处理策略。error_page指令使用方式为error_page ${code} ${custom-code} ${url}
, 案例如下:
error_page 500 501 502 =200 /50x.html
location = /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。
3.set和变量
3.1 set用法
nginx配置文件中可以使用变量提取公共部分的配置。变量只有一种类型,即字符串。在声明和使用变量的地方都需要加上$前缀,变量一旦声明,在整个nginx配置文件中都生效。如下所示:
server {
server_name localhost;
listen 8001;
set $seong ewen;
location /query {
return 200 "hello $seong world";
}
}
测试结果如下所示:
[root@host44 conf]# curl http://localhost:8001/query
hello ewen world
#如果使用变量前没有定义,会抛出异常,如下所示:
nginx: [emerg] unknown "seong" variable
3.2 预置变量
Nginx中预置了很多可以直接使用的变量,以下对常用变量进行介绍。
说明:Nginx提供的变量相对于每个请求而言,即每个请求对应不同的副本,类似于平行空间。
#1.url与协议相关
$request_uri 客户端请求URI, 带完整的参数
$uri 客户端请求URI, 不带任何参数
$request_method HTTP请求的方法名, 如 GET、POST等
#2.地址和端口相关
$remote_addr 客户端的地址
$remote_port 客户端的端口
$server_addr 服务器地址
$server_port 服务器端口
#3.请求头
$content_length 客户端请求头的Content-Length 字段
$content_type 表示客户端请求头的Content-Type 字段
$cookie_COOKIE 表示在客户端请求头的cookie 字段
$host 表示客户端请求头的Host字段
#4.请求参数相关
$args 客户端请求中的完整参数。 例如, 在请求/query?id=400&name=seong 中, $args表示字符串id=400&name=seong.
$arg_PARAMETER HTTP 请求中某个参数的值, 如/query?id=400&name=seong, 可以用$arg_name取得seong这个值
$query_string 请求URI中的参数,与$args相同,区别是只读
4.if指令
可以在server块或者location块中使用if指令。语法为:
if (condition) {
}
该指令用于检测条件是否符合,符合则执行大括号内指令。
说明: if指令不支持多个条件的"与"/或"处理, 不支持else和else if语法,不支持嵌套
condition中一般进行字符串的匹配以及文件是否存在等判断,以下对常见用法进行整理:
[1] = 表示字符串是否相等;
[2] ~ 和 ~* 表示字符串的正则表达式匹配,后者不区分大小写;
[3] -f 文件是否存在;-d 目录是否存在;-e 文件或目录是否存在;
另外,可通过添加!进行逻辑取反。
案例如下:
server {
server_name remote44;
listen 8001;
set $seong ewen;
location /query {
if ($arg_name = "seong") {
return 200 "hello $seong world";
}
return 200 "hello world";
}
}
测试结果如下所示:
[root@124 conf]# curl http://localhost:8001/query?name=seong
hello ewen world
[root@124 conf]# curl http://localhost:8001/query
hello world