`
ycsk
  • 浏览: 154911 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Nginx add custom header

阅读更多
公司客户端需要读取HEADER中的length字段,length字段的值与Content-Length值一样。以前是通过在apache中写一个perl模块实现的,现在切换为Nginx,需要开发Nginx模块。用C写Nginx模块还是比较简单的,可以通过Header Filter实现这个功能。就是在响应数据准备好以后,发送给客户端之前,增加我们的功能。

首先config文件对filter模块和其它处理模块配置不一样:

引用

"config" for filter modules:

ngx_addon_name=ngx_http_<your module>_module
HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_<your module>_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_<your module>_module.c"

"config" for other modules:

ngx_addon_name=ngx_http_<your module>_module
HTTP_MODULES="$HTTP_MODULES ngx_http_<your module>_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_<your module>_module.c"



我的config:
ngx_addon_name=ngx_http_sukai_addlength_module
HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_sukai_addlength_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_sukai_addlength_module.c"


创建文件ngx_http_sukai_addlength_module.c:

/*
 * Copyright (C) Kai.Su MSN:ycsk02@hotmail.com QQ:417331518
 * ./configure --with-pcre=/usr/local/src/pcre-8.12 --prefix=/byread/bin/nginx --with-http_stub_status_module --with-http_perl_module --with-perl=/byread/bin/perl/bin/perl --add-module=/usr/local/src/nginx-0.8.54/sukai-addlength-module
 */

#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>


typedef struct {
        ngx_flag_t enable;
} ngx_http_sukai_addlength_loc_conf_t;


static ngx_http_output_header_filter_pt ngx_http_next_header_filter;

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


static ngx_int_t
ngx_http_sukai_addlength_filter_init(ngx_conf_t *cf);

static ngx_command_t ngx_http_sukai_addlength_module_commands[] = {
        { ngx_string("enable_addlength"),
                NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
                ngx_conf_set_flag_slot,
                NGX_HTTP_LOC_CONF_OFFSET,
                0,
                NULL },

        ngx_null_command
};

static ngx_http_module_t ngx_http_sukai_addlength_module_ctx = {
        NULL, /* preconfiguration */
        ngx_http_sukai_addlength_filter_init, /* postconfiguration */

        NULL, /* create main configuration */
        NULL, /* init main configuration */

        NULL, /* create server configuration */
        NULL, /* merge server configuration */

        ngx_http_sukai_addlength_create_loc_conf, /* create location configuration */
        ngx_http_sukai_addlength_merge_loc_conf /* merge location configuration */
};


ngx_module_t ngx_http_sukai_addlength_module = {
        NGX_MODULE_V1,
        &ngx_http_sukai_addlength_module_ctx, /* module context */
        ngx_http_sukai_addlength_module_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
};


static ngx_int_t
ngx_http_sukai_addlength_header_filter(ngx_http_request_t *r)
{
        ngx_http_sukai_addlength_loc_conf_t *conf;
        conf = ngx_http_get_module_loc_conf(r, ngx_http_sukai_addlength_module);
        if(conf->enable) {
			ngx_table_elt_t *length_header = (ngx_table_elt_t *)ngx_list_push(&r->headers_out.headers);
			if (length_header != NULL) 
			{
				length_header->hash = 1;
				length_header->key.len = sizeof("length") - 1;
				length_header->key.data = (u_char *)"length";
				ngx_buf_t *b;
				b = ngx_create_temp_buf(r->pool, sizeof(off_t));
				b->last = ngx_sprintf(b->last, "%O", r->headers_out.content_length_n);
				b->memory = 1;
				b->last_buf = 1;
				length_header->value.len = b->last - b->start;
				length_header->value.data = b->start;
			}
			ngx_table_elt_t *my_header = (ngx_table_elt_t *)ngx_list_push(&r->headers_out.headers);
			if (my_header != NULL) 
			{
				my_header->hash = 1;
				my_header->key.len = sizeof("Mod-Author") - 1;
				my_header->key.data = (u_char *)"Mod-Author";
				my_header->value.len = sizeof("sukai,ycsk02@hotmail.com") - 1;
				my_header->value.data = (u_char *)"sukai,ycsk02@hotmail.com";
			}
        }
        return ngx_http_next_header_filter(r);
}




static ngx_int_t
ngx_http_sukai_addlength_filter_init(ngx_conf_t *cf)
{
        ngx_http_next_header_filter = ngx_http_top_header_filter;
        ngx_http_top_header_filter = ngx_http_sukai_addlength_header_filter;
        return NGX_OK;
}

static void *
ngx_http_sukai_addlength_create_loc_conf(ngx_conf_t *cf)
{
    ngx_http_sukai_addlength_loc_conf_t *conf;

    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_sukai_addlength_loc_conf_t));
    if (conf == NULL) {
        return NGX_CONF_ERROR;
    }

    conf->enable = NGX_CONF_UNSET;
    return conf;
}

static char *
ngx_http_sukai_addlength_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
{
    ngx_http_sukai_addlength_loc_conf_t *prev = parent;
    ngx_http_sukai_addlength_loc_conf_t *conf = child;

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

    return NGX_CONF_OK;
}




分享到:
评论

相关推荐

    nginx配置教程之add_header的坑详解

    **Nginx 配置教程:深入理解 `add_header` 指令的陷阱** `add_header` 是 Nginx 的 `headers` 模块中的一个关键指令,它允许我们在 HTTP 响应头中添加自定义字段。然而,这个指令在实际使用中存在一些需要注意的坑...

    nginx-add-custom-header:nginx使用lua扩展添加一个自定义的头

    nginx-add-custom-header 简介 使用openresty写的一个扩展。 添加一个自定义的header--x-mls-logid,用来追踪接口之间的调用流程。 测试环境 MacOSX 10.10.3 8GB i5 openresty 1.7.2.1 PHP 5.4.38 测试结果 使用wrk...

    NGINX+FFMPEG

    add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; add_header Access-Control-Max-Age 1728000; add_...

    nginx 笔记和资料

    add_header Cache-Control "public"; add_header ETag ""; access_log off; log_not_found off; proxy_cache my_cache; proxy_cache_key $scheme$proxy_host$request_uri; proxy_cache_valid 200 301 302 60m...

    nginx配置

    add_header Cache-Control public; # 添加缓存控制头 } ``` ### 4. 反向代理与负载均衡 通过`proxy_pass`,Nginx可以作为反向代理服务器,将客户端请求转发到后端应用服务器。同时,结合`upstream`模块,可以实现...

    nginx服务器配置解决ajax的跨域问题

    总结来说,解决Ajax跨域问题的关键在于设置合适的响应头,而在Nginx服务器上实现这一目标需要对`nginx.conf`或相关站点配置文件进行编辑,添加适当的`add_header`指令。正确配置后,Nginx将允许来自不同源的Ajax请求...

    Nginx视频教程(第二讲).zip

    add_header Cache-Control public; } ``` 在本视频教程中,你将学习如何配置这些高级特性,如何调试和优化Nginx配置,以及如何监控和管理Nginx服务。通过理论讲解和实战演练,你将具备独立搭建和维护Nginx高可用...

    Nginx 操作响应头信息的实现

    在Nginx中,添加响应头信息通常使用的是`add_header`指令,而`add_trailer`则用于添加响应尾部信息。这两个指令在使用上有一定的相似性,但也有所区别。`add_header`主要用于在响应头部添加自定义的头信息,其基本...

    深入浅析Nginx实现AJAX跨域请求问题

    add_header 'Access-Control-Allow-Headers' 'your-custom-headers'; ``` 其中`your-custom-headers`应替换为你希望允许的头名称列表,用逗号分隔。 为了使配置生效,需要重启Nginx服务。这可以通过执行`nginx -s ...

    nginx负载均衡后如何记录来访者IP访客IP浏览者的IP

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ``` 这个指令告诉Nginx,当它将请求转发到后端服务器时,将原始的`X-Forwarded-For`头(包含用户IP)传递给后端。如果这个头不存在,Nginx会创建一...

    nginxfancy

    ./configure --add-module=../nginx-fancyindex make sudo make install ``` 3. 更新Nginx配置文件,添加对Fancyindex的支持。打开`/etc/nginx/nginx.conf`,在合适的http或server段内添加以下配置: ``` ...

    Web服务器Nginx常见的配置选项整理.docx

    - `log_format`自定义日志格式,如`custom`格式记录远程地址、时间戳、请求信息、状态码等。 - `access_log`指定日志文件位置和记录的日志格式。 6. **性能优化**: - `worker_processes`设定Nginx的工作进程数...

    ngx-fancyindex-master

    1. **编译模块**:进入源码目录,执行`./configure --add-module=path/to/ngx-fancyindex-master`来配置Nginx以包含该模块。 2. **编译Nginx**:使用`make`和`make install`命令重新编译和安装Nginx,确保新添加的...

    配置nginx保证frps服务器与web共用80端口的方法

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } ... } ... } ``` 上述配置中,`listen 80;` 表示Nginx监听80端口,`server_name` 指定了域名,`proxy_pass` ...

Global site tag (gtag.js) - Google Analytics