Nginx系列-8 常见指令收集

背景

在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值