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

yizhihongxing

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日

相关文章

  • 浅谈linux下的串口通讯开发

    浅谈 Linux 下的串口通讯开发 什么是串口通讯 在计算机与外设通讯中,串口通讯是一种老而弥坚的通讯方式,它通过一组简单的信号线传输数据,它能够对应用上出现的许多通讯问题提供精确、不出错的通讯解决方案。 Linux 中的串口通讯 在 Linux 中,串口通讯也被广泛应用于硬件与软件的沟通连接中。Linux 操作系统提供了开源的串口通讯库,可以方便的对串口进…

    人工智能概览 2023年5月25日
    00
  • 在Django中创建第一个静态视图

    以下是在Django中创建第一个静态视图的完整攻略: 1. 创建Django项目和应用 首先,我们需要在本地创建一个Django项目。我们可以通过在命令行中输入以下命令来创建项目: django-admin startproject myproject 其中,myproject是项目的名称,你可以设置为任意你喜欢的名称。 接着,我们需要在项目中创建一个应用,…

    人工智能概览 2023年5月25日
    00
  • c++将字符串转数字的实例方法

    接下来我将详细介绍如何使用 C++ 中的方法将字符串转成数字,具体步骤如下: 1. 使用 stoi 函数将字符串转换为整型 C++ 中的 stoi 函数可以将字符串转换为整型。这个函数的使用方法如下: #include <string> #include <iostream> using namespace std; int main…

    人工智能概览 2023年5月25日
    00
  • 解析Java和Eclipse中加载本地库(.dll文件)的详细说明

    当Java程序需要使用本地库(例如Windows上的.dll文件)时,需要首先将本地库加载到Java虚拟机中。本文将提供详细的步骤来解析Java和Eclipse中加载本地库的过程。 步骤一:创建本地库 首先,您需要编写本地库代码,并将其编译成本地库文件(.dll文件)。您可以使用本地编译器,例如Microsoft Visual Studio,在Windows…

    人工智能概论 2023年5月25日
    00
  • 一文秒懂Prometheus 介绍及工作原理

    一文秒懂Prometheus介绍及工作原理 简介 Prometheus是一款由SoundCloud开发的开源监控系统和时间序列数据库(TSDB)。它可以处理大量数据,并提供了简单易用的查询语言,使得用户可以高效地对数据进行查询、分析和预警。Prometheus最初受Google内部监控系统Borgmon的启发,然后被开源社区所接纳。 工作原理 Prometh…

    人工智能概览 2023年5月25日
    00
  • 解决django xadmin主题不显示和只显示bootstrap2的问题

    下面是针对 Django xadmin 主题不显示和只显示 bootstrap2 的问题的完整攻略: 问题描述 在使用 Django xadmin 后台管理系统时,我们可能会遇到以下两个问题: xadmin 主题显示异常:前端页面没有样式,显示非常原始; xadmin 只显示 bootstrap2 样式:页面只显示 bootstrap2 的样式而不是应该的主…

    人工智能概览 2023年5月25日
    00
  • Node.js连接MongoDB数据库产生的问题

    连接MongoDB数据库是Node.js开发的重要环节之一。下面我们将详细讲解在连接MongoDB数据库时可能会出现的问题及其解决办法,供开发者参考。 问题一:安装MongoDB驱动 在使用Node.js连接MongoDB数据库前,需要先安装MongoDB的驱动模块。可以使用npm install mongodb命令进行安装。同时,还需注意模块版本与Mong…

    人工智能概论 2023年5月25日
    00
  • C++之openFrameworks框架介绍

    C++之openFrameworks框架介绍 什么是openFrameworks openFrameworks是一个开源的C++跨平台创意编程框架,旨在使创意编程变得更加容易、更容易使用并且开放。它通过封装大量的C++库和硬件驱动程序,提供了一种快速开发原型、制作交互式的多媒体应用程序、绘画、制作自动化等领域的框架。它支持多种操作系统,如Linux、MacO…

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