`
张立军
  • 浏览: 35409 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

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

这个例子是从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

 

 

 

2
0
分享到:
评论

相关推荐

    Nginx模块源码 nginx-notice-2

    **Nginx模块源码分析:...理解其源码可以提升对Nginx模块开发的理解,同时,编译和配置过程是学习Nginx扩展功能的重要实践环节。在实际应用中,这样的模块可以帮助我们实现定制化的服务器功能,以满足特定业务需求。

    深入理解Nginx模块开发与架构解析完整-高清-目录-最新版

    总的来说,《深入理解Nginx模块开发与架构解析》是一本全面覆盖Nginx技术的指南,无论你是初学者还是资深开发者,都能从中获取到宝贵的实战经验和理论知识,提升你在网络服务器领域的专业技能。通过阅读这本书,你将...

    Nginx开发指南.pdf

    #### 十二、模块开发 - Nginx支持模块化扩展,允许用户根据需求开发新的模块。 - 添加新模块:按照特定的接口规范编写新模块。 - 核心模块:预置的核心功能模块。 - 配置指令:用于配置模块行为的指令。 #### 十...

    Nginx+lua通过url传参的方式实现动态代理

    - `ngx.var.remotePort = arg["port"]`:通过`arg["port"]`获取名为`port`的参数值,并将其赋值给Nginx变量`$remotePort`。 #### 总结 通过以上步骤,我们成功实现了基于Nginx+Lua的动态代理功能。这种方案不仅...

    Nginx从入门到精通

    #### 二、Nginx模块开发篇 - **初探Nginx架构**:Nginx采用了一个异步事件驱动的架构模型,该模型使得Nginx能够高效地处理大量的并发连接。 - **Nginx基础概念**: - **Master-Worker模式**:一个主进程负责监听...

    Nginx面试专题及答案.pdf

    在Nginx中获得当前时间需要使用SSI模块和相关变量,比如`$date_gmt`和`$date_local`,通过`Proxy_set_header`指令将时间变量传递给后端服务器。 `-s`参数用于运行Nginx服务器的可执行文件,它允许执行停止、重新...

    Nginx开发从入门到精通.pdf.docx

    本书不仅涵盖了Nginx的基础知识,还深入探讨了其高级特性和模块开发技巧。 #### 二、Nginx概述 1. **历史沿革**: - Nginx最初由俄罗斯程序员Igor Sysoev在2002年开始开发。 - 由于其设计上的优势,尤其是在高...

    Centos 7 64 +[nginx+ngx_lua 模块] 支持WAF防护功能

    - 下载lua-nginx-module,这是一个用于在Nginx中执行Lua脚本的模块。 4. **配置环境变量** 设置LUAJIT_LIB和LUAJIT_INC环境变量,以便在编译时找到LuaJIT的库和头文件。 5. **配置和编译** 在Nginx源码目录下,...

    echo-nginx-module-0.61.tar.gz

    echo-nginx-module的使用需要先将其编译并添加到Nginx配置中。首先解压下载的echo-nginx-module-0.61.tar.gz文件,然后按照Nginx的模块扩展流程进行编译。配置文件中可以通过echo、echo_sleep、echo_read_request_...

    nginx-vs2010

    2. **播放流**:客户端使用Flash Player或者现代浏览器的HLS播放器,通过URL访问Nginx服务器上的流媒体内容。 3. **监控与调试**:Nginx提供日志功能,可以通过查看日志文件了解流媒体服务的状态,及时发现并解决...

    ngx_http_mytest_module.zip_nginx_world

    在本文中,我们将深入探讨如何进行Nginx的模块二次开发,特别关注“ngx_...通过分析和实践这个项目,开发者可以逐步掌握Nginx模块开发的关键技术,为进一步开发功能丰富的Nginx插件打下坚实基础。

    Nginx 应用技术指南

    以上是对《Nginx应用技术指南》中的主要知识点进行了详细的总结和扩展,涵盖了Nginx的基础知识、安装配置、优化技巧、URL分发、重写规则、访问控制、日志处理等多个方面,旨在帮助读者全面掌握Nginx的应用技巧和最佳...

    agentzh 的 Nginx 教程(版本 2016.07.21) pdf与htm打包

    《agentzh的Nginx教程(版本2016.07.21)》是一部由知名开源社区成员agentzh编写的Nginx技术指南,它涵盖了Nginx的广泛主题,包括基础配置、模块开发、性能优化以及高级用法。这个教程的特色在于其详尽的内容和对...

    php apache/nginx

    标题中的“php apache/nginx”指的是在Web开发中使用PHP与Apache或Nginx服务器进行集成的技术。Apache和Nginx都是流行的HTTP服务器,用于托管静态和动态内容。PHP是一种广泛使用的开源脚本语言,尤其适合处理动态...

    Nginx安装lua-nginx-module模块的方法步骤

    现在你可以通过编写Lua脚本来实现各种功能,如动态内容生成、URL重写、数据处理等,进一步提升Nginx的灵活性和功能性。 值得注意的是,OpenResty是一个打包了Nginx、lua-nginx-module以及其他相关模块的完整解决...

    Nginx-应用指南。

    Nginx提供丰富的内置变量,如$remote_addr获取客户端IP、$request_uri获取请求URI、$http_user_agent获取用户代理信息等,这些变量可以用于配置中的条件判断和动态内容生成。 总之,Nginx以其高效的性能、强大的...

    nginx-http-flv-win32.rar

    2. 安装Nginx:将解压后的Nginx服务器二进制文件复制到适当的位置,并按照官方文档配置环境变量。 3. 配置Nginx:编辑Nginx的配置文件(通常为nginx.conf),添加或修改模块以支持HTTP FLV流。这可能涉及到添加`...

Global site tag (gtag.js) - Google Analytics