nginx 内置变量详解及隔离进行简单的拦截

nginx 内置变量详解及隔离进行简单的拦截

什么是 nginx 内置变量

Nginx 内置变量是由 Nginx 定义的一组变量,用于获取与请求相关联的信息。这些变量可以用于配置 Nginx 的行为或传递给后端应用程序作为请求参数。

常见的内置变量

以下是一些常见的 nginx 内置变量:

  • $request_method:请求方法(GET、POST等)。
  • $scheme:协议类型(HTTP或HTTPS)。
  • $http_user_agent:浏览器 user-agent 字符串。
  • $remote_addr:客户端 IP 地址。
  • $server_name:服务器名称。

如何使用 nginx 内置变量

可以通过在 Nginx 配置文件中使用以下语法来访问 nginx 内置变量:

location / {
    add_header X-Request-Id $request_id;
    proxy_pass http://backend$request_uri;
}

以上配置中的 $request_id 就是 Nginx 内置变量,用于将此请求的唯一标识符返回给客户端。

如何隔离进行简单的拦截

可以使用 Nginx 内置变量进行基本的隔离和拦截,以确保进入应用程序的请求仅能是来自特定来源的请求。例如,以下是通过 HTTP Referrer 进行隔离的简单示例:

location / {
    if ($http_referer !~* "example\.com") {
        return 403;
    }
    proxy_pass http://backend$request_uri;
}

以上示例中,使用 $http_referer 内置变量检查 HTTP 引用器(Referrer)的值是否为 example.com,如果不是,则返回 403 状态码。

示例说明

下面我们来看两个实际的示例:

  1. 使用 $query_string 内置变量控制缓存
http {
    # 配置缓存忽略 query string 参数
    proxy_cache_key "$scheme$request_method$host$request_uri";

    server {
        listen 80;
        server_name example.com;

        location / {
            # 如果请求中存在 query string 参数,则需要重新访问后台获取数据。
            if ($query_string != "") {
                return 404;
            }

            # 设置缓存过期时间
            expires 10m;
            # 缓存 status 和 http headers
            proxy_cache_revalidate on;
            proxy_cache_bypass $http_pragma;
            proxy_cache_bypass $http_authorization;
            add_header X-Cache-Status $upstream_cache_status;
            proxy_cache_valid 200 10m;

            # 转发请求到后端服务器
            proxy_pass https://backend-server;
        }
    }
}

以上示例中,使用 $query_string 内置变量检查 HTTP 请求中是否带有查询参数。如果存在查询参数,则直接返回 404,不使用缓存。如果没有查询参数,则使用 proxy_cache_key 内置变量组成缓存的键,并设置缓存的过期时间和相应的缓存策略,最后将请求转发到后端服务器。

  1. 使用 $remote_addr 内置变量对 IP 地址进行访问控制
http {
    geo $blocked_ip {
        default 0;
        10.0.0.0/8 1;
        172.16.0.0/12 1;
        192.168.0.0/16 1;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            # 如果请求来自被列入黑名单的 IP,则返回 403
            if ($blocked_ip) {
                return 403;
            }

            # 转发请求到后端服务器
            proxy_pass https://backend-server;
        }
    }
}

以上示例通过使用 $remote_addr 内置变量,使用 Nginx 的 Geo 模块进行 IP 地址过滤,将特定 IP 地址列入黑名单,并禁止其进行访问。对于禁止访问的 IP 地址,使用 return 403 返回 403 状态码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nginx 内置变量详解及隔离进行简单的拦截 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Django MTV和MVC的区别详解

    Django MTV和MVC的区别详解 什么是MVC? MVC,即 Model-View-Controller,是一种常见的软件架构模式,常用于Web应用程序和图形用户界面(GUI)设计。在MVC模式中,应用程序被分为三个主要部分:模型,视图和控制器。 模型(Model):存储应用程序的数据,并负责管理数据。它与数据库交互,对数据进行操作。 视图(View)…

    人工智能概览 2023年5月25日
    00
  • Python bsonrpc源码解读

    Python bsonrpc源码解读 简介 Python bsonrpc是一种基于消息传递机制的RPC通信框架,它使用BSON作为数据序列化格式,支持两个进程或线程之间的通信。本文主要对Python bsonrpc框架的源码进行解读,包括其核心概念和实现原理。 核心概念 Service: 服务接口类,定义了服务端提供的远程方法。 ServiceHandler…

    人工智能概览 2023年5月25日
    00
  • Android实现扫一扫识别数字功能

    下面是针对“Android实现扫一扫识别数字功能”的完整攻略。 步骤一:添加ZXing库 下载并导入ZXing库。 在build.gradle文件中添加ZXing依赖 dependencies { implementation ‘com.google.zxing:core:3.3.3’ } 步骤二:添加扫码识别逻辑 在AndroidManifest.xml中…

    人工智能概论 2023年5月25日
    00
  • Python用GET方法上传文件

    使用GET方法上传文件在HTTP协议中是不符合规范的。一般来说,上传文件应该使用POST方法或PUT方法。而在Python中使用GET方法上传文件也是不建议的。以下是使用Python通过POST方法上传文件的完整攻略: 1. 准备上传文件和服务器接口 首先,我们需要准备好要上传的文件,以及服务端接口。为了方便演示,我们可以先创建一个本地的测试文件,并搭建一个…

    人工智能概论 2023年5月25日
    00
  • Centos系统中如何在指定位置下安装Nginx

    在Centos系统上安装Nginx需要以下步骤: 1.更新系统 在安装任何软件包之前,最好先更新系统软件。您可以使用以下命令更新Centos系统: sudo yum update 2.安装EPEL存储库 EPEL是一个额外的软件包库,其中包含很多软件包,这些软件包不包含在Centos官方存储库中。Nginx有一个很好的EPEL存储库,我们需要安装它来获得Ng…

    人工智能概览 2023年5月25日
    00
  • Ubuntu下使用python3中的venv创建虚拟环境

    下面是Ubuntu下使用python3中的venv创建虚拟环境的完整攻略: 1. 安装python3-venv 在使用python3中的venv创建虚拟环境之前,需要确保已经安装了python3-venv。可以使用以下命令进行安装: sudo apt-get update sudo apt-get install python3-venv 2. 创建虚拟环境…

    人工智能概览 2023年5月25日
    00
  • Pytorch创建张量的四种方法

    PyTorch是一个基于Python的科学计算库,它是一个用于深度学习的开源机器学习框架,被广泛应用于自然语言处理、计算机视觉等领域。而张量(Tensor)是PyTorch中的重要数据类型,其类似于Numpy中的Numpy数组。 在PyTorch中,创建张量有四种方法:从Python列表中创建、从Numpy数组中创建、使用随机数创建、使用全零或全一的张量。 …

    人工智能概论 2023年5月25日
    00
  • 让python 3支持mysqldb的解决方法

    Python 3中不再支持mysqldb的库,这意味着如果你需要在Python 3中连接MySQL数据库,你需要进行一些额外的步骤。下面是让Python 3支持mysqldb的步骤: 步骤一:安装pymysql包 pymysql是一个纯Python的MySQL库,可以直接在Python 3中使用。你可以使用pip来安装pymysql,命令如下: pip in…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部