Nginx模块开发 从url变量中读取内容并显示

Nginx高级(六):nginx rewrite规则模块解析 1、简介 Rewrite是nginx服务器提供的一个重要基本功能,在Web服务器产品中几乎是必备的功能,主要用于实现URL的重写。 URL的重写能让我们在改变网站结构后,无需要求客户端用户修改原来的书签,也无需其他网站修改对我们网站的链接地址,能够提高网站的安全性。 2、规则模块解析 rewrite和location的功能有点相像,都能实现跳转,主要区别在于rewrite常用于同一域名内更改获取资源的路径,而location是对一类路径做控制访问和反向代理,可以proxy_pass到其他服务器。很多情况下r 阅读详情

这是由前面的一个最简单的例子修改而成的。

前面的例子是从配置文件中读取内容,并显示。

这个例子是从url变量中读取内容并显示。

 

 

 

#include <ngx_config.h>

#include <ngx_core.h>

#include <ngx_http.h>

 

static char* ngx_echo_readconf(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

static void* ngx_echo_create_loc_conf(ngx_conf_t *cf);

static char* ngx_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child);

ngx_int_t ngx_http_hi_module_init(ngx_conf_t *cf);

 

typedef struct {

    ngx_str_t ecdata;

    ngx_flag_t           enable;

} ngx_echo_loc_conf_t;

 

// 读取配置文件内容 echo -> ecdata

// 1、ngx_echo_readconf是程序第一步

static ngx_command_t  ngx_echo_commands[] = {

    { ngx_string("echo"),

      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,

      ngx_echo_readconf,

      NGX_HTTP_LOC_CONF_OFFSET,

      offsetof(ngx_echo_loc_conf_t, ecdata),

      NULL },

      ngx_null_command

};

 

 

static ngx_http_module_t  ngx_echo_module_ctx = {

    NULL,                          /* preconfiguration */

    ngx_http_hi_module_init,           /* postconfiguration 从配置文件中读取key定义 */

 

    NULL,                          /* create main configuration */

    NULL,                          /* init main configuration */

 

    NULL,                          /* create server configuration */

    NULL,                          /* merge server configuration */

 

    ngx_echo_create_loc_conf,  /* create location configuration */

    ngx_echo_merge_loc_conf /* merge location configuration */

};

 

//////////////////////

//     定义模块              //

//////////////////////

ngx_module_t  ngx_http_hi_module = {

    NGX_MODULE_V1,

    &ngx_echo_module_ctx, /* module context */

    ngx_echo_commands,   /* module directives */

    NGX_HTTP_MODULE,               /* module type */

    NULL,                          /* init master */

    NULL,                          /* init module */

    NULL,                          /* init process */

    NULL,                          /* init thread */

    NULL,                          /* exit thread */

    NULL,                          /* exit process */

    NULL,                          /* exit master */

    NGX_MODULE_V1_PADDING

};

 

// 获得URL参数

static ngx_int_t  ngx_http_key_index;

static ngx_str_t  ngx_http_key_value = ngx_string("key");

ngx_http_variable_value_t      *key_vv;

 

static ngx_int_t

ngx_http_hi_module_variable_not_found(ngx_http_request_t *r,

        ngx_http_variable_value_t *v, uintptr_t data)

{

    v->not_found = 1;

    return NGX_OK;

}

 

static ngx_int_t

ngx_http_hi_module_add_variable(ngx_conf_t *cf, ngx_str_t *name) {

    ngx_http_variable_t         *v;

 

    v = ngx_http_add_variable(cf, name, NGX_HTTP_VAR_CHANGEABLE);

    if (v == NULL) {

        return NGX_ERROR;

    }

 

    v->get_handler = ngx_http_hi_module_variable_not_found;

 

    return ngx_http_get_variable_index(cf, name);

}

 

 

//////////////////////

//     主要的处理函数

//////////////////////

static ngx_int_t

ngx_echo_handler(ngx_http_request_t *r)

{

    printf("called:ngx_echo_handler/n");

 

    ////////////////////////////////////////////

    //        读取URL里面具体的key变量的值

    ////////////////////////////////////////////

    key_vv = ngx_http_get_indexed_variable(r,

     ngx_http_key_index);

 

//    printf("read URL key idx:%d/n",ngx_http_key_index);

//    printf("read URL key:%s/n",key_vv->data);

 

    ngx_int_t     rc;

    ngx_buf_t    *b;

    ngx_chain_t   out;

 

    ngx_echo_loc_conf_t  *cglcf;

    cglcf = ngx_http_get_module_loc_conf(r, ngx_http_hi_module);

 

// 限制请求的方法

    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {

        return NGX_HTTP_NOT_ALLOWED;

    }

    if (r->headers_in.if_modified_since) {

        return NGX_HTTP_NOT_MODIFIED;

    }

 

    r->headers_out.content_type.len = sizeof("text/html") - 1;

    r->headers_out.content_type.data = (u_char *) "text/html";

 

 

 

    r->headers_out.status = NGX_HTTP_OK; // 发送状态码

//    r->headers_out.content_length_n = cglcf->ecdata.len;

    r->headers_out.content_length_n = key_vv->len; // 发送内容长度

    if (r->method == NGX_HTTP_HEAD) {

        rc = ngx_http_send_header(r);

 

        if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {

            return rc;

        }

    }

 

    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));

    if (b == NULL) {

    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer.");

        return NGX_HTTP_INTERNAL_SERVER_ERROR;

    }

 

    ////////////////////////////////////////////

    //       定义输出

    ////////////////////////////////////////////

    out.buf = b;

    out.next = NULL;

 

 

//    b->pos = cglcf->ecdata.data;

//    b->last = cglcf->ecdata.data+(cglcf->ecdata.len);

    ////////////////////////////////////////////

    //       给输出复制

    ////////////////////////////////////////////

    b->pos = key_vv->data;

    b->last = key_vv->data+(key_vv->len);

 

    b->memory = 1;

    b->last_buf = 1;

    rc = ngx_http_send_header(r);

 

    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {

        return rc;

    }

    return ngx_http_output_filter(r, &out); // 交给过滤器

}

 

//////////////////////

//     读取配置 echo

//////////////////////

static char *

ngx_echo_readconf(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)

{

    printf("called:ngx_echo_readconf/n");

    ngx_http_core_loc_conf_t  *clcf;

 

    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);

    clcf->handler = ngx_echo_handler; // 2、主要的处理函数:ngx_echo_handler是程序第二步

    ngx_conf_set_str_slot(cf,cmd,conf);

 

    return NGX_CONF_OK;

}

 

 

static void *

ngx_echo_create_loc_conf(ngx_conf_t *cf)

{

    printf("called:ngx_echo_create_loc_conf/n");

    ngx_echo_loc_conf_t  *conf;

 

    conf = ngx_pcalloc(cf->pool, sizeof(ngx_echo_loc_conf_t));

    if (conf == NULL) {

        return NGX_CONF_ERROR;

    }

 

    conf->ecdata.len=0;

    conf->ecdata.data=NULL;

    conf->enable = NGX_CONF_UNSET;

    return conf;

}

static char *

ngx_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)

{

    printf("called:ngx_echo_merge_loc_conf/n");

    ngx_echo_loc_conf_t *prev = parent;

    ngx_echo_loc_conf_t *conf = child;

 

    ngx_conf_merge_str_value(conf->ecdata, prev->ecdata, 10);

    ngx_conf_merge_value(conf->enable, prev->enable, 0);

 

    return NGX_CONF_OK;

}

 

//////////////////////

// 从配置文件中读取key定义

//////////////////////

ngx_int_t

ngx_http_hi_module_init(ngx_conf_t *cf)

{

    printf("called:ngx_http_hi_module_init/n");

 

    // 读key参数

    if ((ngx_http_key_index = ngx_http_hi_module_add_variable(

                cf, &ngx_http_key_value)) == NGX_ERROR)

    {

        return NGX_ERROR;

    }

 

    return NGX_OK;

 

}

 

 

下面是配置文件

 

worker_processes  1;

daemon off; 

master_process  off;

error_log  /tmp/error.log debug;

pid /tmp/nginx_demo.pid;

events {

    worker_connections  1024;

}

http {

    #include       /etc/nginx/mime.types;

    sendfile        on;

    keepalive_timeout  65;

    tcp_nodelay        on;

    server {

        listen   8100;

        server_name  localhost;

        access_log  /tmp/access.log;

        error_log  /tmp/error.log debug;

        location /hello {

            set $key $arg_key;

            echo "abcd";

        }

    }

}

 

 

访问方法

 

http://10.1.6.100:8100/hello?key=012sadf

学习nginx配置 server { listen 80; server_name www.abc.com; rewrite ^(.*)$ https://$host$1 permanent; } server { listen 443; server_name www.abc.com; root html/www; index inde... 阅读详情

相关推荐

7、NGINX HTTP核心模块指令与变量深度解析

本文深入解析了NGINX HTTP核心模块的关键指令和变量,涵盖了文件处理与缓存、HTTP/2支持、日志配置、变量使用等方面。通过合理配置这些指令和变量,可以优化NGINX的性能、安全性和灵活性,满足多样化的Web服务需求。

study的专栏 115

【Nginx】截取URL中某个参数Parameter

略

sayyy的专栏 1万+

vfsglobal预约系统登录问题全解析(by quqi99)

本文全面解析VFS Global预约系统登录常见问题,包括IP限制、验证码验证失败及账号自动删除等。提供详细的解决方案,如DNS配置、浏览器设置及邮箱选择建议,帮助用户顺利完成签证预约。特别针对中国用户遇到的IP限制问题,给出了实用技巧。

gamma的博客 1340

04_Nginx_从url中获取参数

04_Nginx_从url中获取参数1. 导读2. 代码示例3. 实验截图 1. 导读 需要从url中获取到想要的参数,特此记录方式 2. 代码示例 使用的是ngx_http_request_t结构体中的args参数; printf("=====================\n"); char szArgs[1000] = {0}; memcpy(szArgs, r->args.data, r->args.len); printf("获取到的参数

田一一 6500

【电击防护篇】电击防护技术详解:从人体效应到接地系统全解析

本文系统讲解了电击防护的关键知识,包括电流对人体的影响(如30mA是心室颤动阈值)、人体电阻特性(700Ω-6100Ω)以及电气接触防护措施。重点分析了TT、TN和IT三大接地系统的结构特点与应用场景,强调TN-S系统最安全,IT系统供电连续性最佳。详细介绍了漏电保护器(RCD)的工作原理与选型指南,建议人身防护选用30mA高灵敏度RCD。文章通过对比表总结三大系统的安全性、成本及适用场景,为电气安全设计提供实用参考。

2301_81299416的博客 1742

用Unity Wheel Collider做坦克转向?3步实现履带式载具物理效果

本文详细解析了如何利用Unity的Wheel Collider组件实现履带式载具的差速转向物理效果。通过思维转换、场景搭建和核心代码实现三步,将Wheel Collider从模拟轮式车辆转向改造为控制履带扭矩差的系统,并深入探讨了参数调试与真实感提升的方法,帮助开发者打造物理反馈扎实的坦克或特种车辆模拟。

weixin_29009971的博客 223

Nginx服务学习

如何将不同用户的请求流量分发到不同的服务器上呢?

weixin_45515971的博客 6310

Docker篇——Docker常用命令大全!史上最全面的Docker命令,涵盖常规命令、镜像基本命令、容器基本命令以及常用其他命令,一篇文章速通!

本篇文章介绍的关于DOcker的命令非常全面,Docker常见的命令介绍完毕,涉及到的命令比较繁杂,希望大家可以收藏并坚持学习。后续还会持续更新相关技术点,敬请期待

我热爱学习,也乐于分享。无论是科技前沿的洞见,还是生活中的小技巧,我都会在这里与你分享。我相信,知识就是力量,而分享则能让这份力量得到更好的传递。 5746

Nginx系列之过滤模块以及变量使用

通过规则说明和实际例子演示的方式,讲解Nginx中过滤模块以及与变量使用相关的模块的使用

qiaotl的博客 2882

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

SPRD Android 14 通过属性控制系统设置显示双栏或者单栏

m0_60898338的博客 1118

这才是 Python 的正确玩法!用强化学习 (RL) 训练 AI 玩《王者荣耀》,胜率 90%!

大家打排位时,一定遇到过那种“意识神级、操作零失误”的对手,或者“走位呆滞、送人头”的队友。以前的“人机”是程序员写死的脚本(If 血量<20% Then 回城)。而现在的顶级 AI(如腾讯绝悟、OpenAI Five),是靠强化学习 (Reinforcement Learning)自己“左右互搏”练出来的。今天,我们不谈枯燥的数学公式,我将手把手教你用,搭建一个能玩 MOBA 游戏的 AI Agent。即使不能去 KPL 打职业,虐一下钻石局还是绰绰有余的!

BUG猿的博客 1182

Nginx基础知识. Nginx模块开发

Nginx模块开发初识     下面将开发一个简单的HTTP模块作为线索进行讲解. Part1. 模块需要使用的信息存储结构 关于ngx_module_t 既然要进行模块开发, 那么就必须会使用到存储模块的数据结构, 下面先看看这个结构体 //因为是初识, 所以结构体的一些变量暂时不管 typedef struct ngx_module_s ngx_module_t; struc

博客 918

Odoo17商城微信支付模块,快速一个实现可在线支付的商城

通过集成微信支付APIv3,Odoo 系统实现了高效、安全的支付流程。Native扫码支付和Jsapi微信浏览器内直接拉起支付为用户提供了更加便捷的支付方式。同时,通过发送下单及支付消息给管理员,商家可以实时了解订单状态并进行相应处理。通过集成微信支付 结合 Odoo 系统内置的商城模块,可以为商家快速实现功能完善、高效的电商解决方案。

AaronZZH 的博客 2268

nginx变量学习总结

参考网址: http://www.ttlsa.com/nginx/nginx-tutorial-from-entry-to-the-master-ttlsa/ nginx变量的创建在加载或启动时进行 nginx变量的赋值在请求处理时发生 每个请求都有独立的变量存放容器副本,主请求以及各个子请求之间的值容器副本互不影响 请求在处理中,通过内部跳转经过多个location块,使用的还是...

qq_14824079的博客 303

ESP32-IDF开发之旅 基础篇⑨ ESP-IDF的FreeRTOS任务间通信和同步

本文介绍了FreeRTOS任务间通信中的队列机制,重点讲解了队列的创建、发送和接收数据的API使用方法。文章提供了详细的技术说明和示例代码,包括xQueueCreate、xQueueSend、xQueueReceive等核心函数的参数说明和返回值解释。通过一个2生产者+1消费者的实际案例,展示了如何在ESP-IDF环境下使用FreeRTOS队列实现任务间通信。示例中包含了数据发送失败处理和接收数据验证等实用技巧,为开发者提供了可参考的实现模式。

单片机菜鸟哥的博客 427

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Nginx变量

    Nginx变量只有一种字符串类型,变量名前使用$符号来引用变量。但不支持通过转衣服来便是$符号,可使用ngx_geo模块来表示,如:     geo $dollar {         default "$";     },可使用$dollar来表示$。     Nginx的set指令首先在nginx启动加载配置时创建变量,而变量的赋值发生在请求处理的时候。其可见范围为整个Ng...

on the way 256

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

nginx变量使用方法详解(3)

为什么80%的码农都做不了架构师?>>> ...

weixin_34130389的博客 362

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

nginx http模块 http过滤模块

request    连接池    在linux系统中,每一个进程能够打开的文件描述符fd是有限的,而每创建一个socket就会占用一个fd,这样创建的socket就会有限的。在Nginx中,采用连接池的方法,可以避免这个问题。    Nginx在实现时,是通过一个连接池来管理的,每个worker进程都有一个独立的连接池,连接池的大小是worker_connecti

tycoon的专栏 1996

nginx只替换url中的主机名_十分钟理解Nginx内置变量

$args #请求中的参数值$query_string #同 $args$arg_NAME #GET请求中NAME的值$is_args #如果请求中有参数,值为"?",否则为空字符串$uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar....

weixin_39534321的博客 1221

(Nginx和PHP下)URL重写,TP实现URL重写

gnix中添加网站重定向由于域名没备案所以不能使用隐性url直接域名转接到另一个网站,所以迫于无奈只能在Vhost上动手脚了,原理是先访问另一个网站,然后由这个网站做转发。方法很简单,找到nginx的conf文件,目录一般在/usr/local/nginx/conf。如果你没有做域名识别,这个文件就在conf文件夹下的nginx.conf,如果做了多域名识别处理,conf文件就在vhost目录下,...

Make the world go 875

yii2通过url访问类中的方法_每日学点---nginx变量使用方法详解(3)

也有一些内建变量是支持改写的,其中一个例子是 $args. 这个变量在读取时返回当前请求的 URL 参数串(即请求 URL 中问号后面的部分,如果有的话 ),而在赋值时可以直接修改参数串。我们来看一个例子: location /test { set $orig_args $args; set $args "a=3&b=4"; echo "original args: $orig_args"...

weixin_39776298的博客 168

【Nginx23】Nginx学习:响应头与Map变量操作

Nginx学习:响应头与Map变量操作响应头是非常重要的内容,浏览器或者客户端有很多东西可能都是根据响应头来进行判断操作的,比如说最典型的 Content-Type ,之前我们也演示过,直接设置一个空的 types 然后指定默认的数据类型的值,所有的请求浏览器都会直接下载。另外,我们现在在做前后分离的开发时,也经常会通过头信息来传递一些标志参数,那么自定义响应头的作用就更加重要了。另外一个 Map...

硬核项目经理 1409

【nginx读取配置文件http模块之location】

【nginx读取配置文件http模块之location】

qq_37674060的博客 3365

文章14:Nginx变量总结(agentch的Nginx教程总结版)

本文主要是针对agentzh 的 Nginx 教程(版本 2012.09.27)的一个总结。 原文详细的介绍网址为http://agentzh.org/misc/nginx/agentzh-nginx-tutorials-zhcn.html 本文只是自己为了学习和记忆Nginx之功用。 其中Nginx变量漫谈(七)和(八)是针对没有值的变量的讨论,未在总结中列出。 1.Nginx变

www.keything.net 9753

nginx变量使用方法详解(4)

为什么80%的码农都做不了架构师?>>> ...

weixin_34337381的博客 131
上一篇: Nginx模块开发 研究1
下一篇: Nginx模块开发 从url变量中key的值 来确定upstream服务器
大得传奇
博客等级 码龄18年 15粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值