要记录HTTP POST请求中的数据,您需要编写一个nginx模块来拦截请求并获取POST数据。以下是一个简单的示例:

  1. 定义一个结构体来存储POST数据:
typedef struct {
    ngx_flag_t    enabled;
    ngx_str_t     file_path;
} ngx_http_log_post_data_loc_conf_t;
  1. 在配置项中定义一个变量来启用/禁用POST数据记录:
static ngx_command_t ngx_http_log_post_data_commands[] = {
    {
        ngx_string("log_post_data"),
        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
        ngx_conf_set_flag_slot,
        NGX_HTTP_LOC_CONF_OFFSET,
        offsetof(ngx_http_log_post_data_loc_conf_t, enabled),
        NULL
    },

    {
        ngx_string("post_data_file_path"),
        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
        ngx_conf_set_str_slot,
        NGX_HTTP_LOC_CONF_OFFSET,
        offsetof(ngx_http_log_post_data_loc_conf_t, file_path),
        NULL
    },

    ngx_null_command
};
  1. 在模块上下文中定义一个回调函数来处理HTTP POST请求:
static ngx_int_t ngx_http_log_post_data_handler(ngx_http_request_t *r)
{
    ngx_http_log_post_data_loc_conf_t  *lplcf;

    lplcf = ngx_http_get_module_loc_conf(r, ngx_http_log_post_data_module);

    if (!lplcf->enabled || r->method != NGX_HTTP_POST) {
        return NGX_DECLINED;
    }

    ngx_buf_t *buf = ngx_create_temp_buf(r->pool, r->headers_in.content_length_n);
    ngx_chain_t *chain = ngx_alloc_chain_link(r->pool);
    chain->buf = buf;
    chain->next = NULL;

    ngx_int_t rc;
    while ((rc = ngx_http_read_client_request_body(r, ngx_http_client_request_body_handler)) >= NGX_AGAIN) {
        if (rc == NGX_ERROR || rc > NGX_OK) {
            return rc;
        }
    }

    if (rc != NGX_OK) {
        return rc;
    }

    if (buf->pos != buf->last) {
        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, "POST data: %V", &buf->pos);
    }

    return NGX_OK;
}
  1. 在初始化函数中将回调函数与HTTP请求类型“post”的处理函数关联:
static ngx_http_module_t ngx_http_log_post_data_module_ctx = {
    NULL,                                /* preconfiguration */
    NULL,                                /* postconfiguration */

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

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

    ngx_http_log_post_data_create_loc_conf, /* create location configuration */
    NULL                                  /* merge location configuration */
};

ngx_module_t ngx_http_log_post_data_module = {
    NGX_MODULE_V1,
    &ngx_http_log_post_data_module_ctx, /* module context */
    ngx_http_log_post_data_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_log_post_data_init(ngx_conf_t *cf)
{
    ngx_http_handler_pt        *h;
    ngx_http_core_main_conf_t  *cmcf;

    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);

    h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
    if (h == NULL) {
        return NGX_ERROR;
    }

    *h = ngx_http_log_post_data_handler;

    return NGX_OK;
}
  1. 在nginx配置文件中启用该模块,并配置POST数据记录路径:
http {
    ...
    log_post_data on;
    post_data_file_path /var/log/nginx/post_data.log;
    ...
}

这样,当客户端提交POST请求时,您将在指定的文件中记录POST数据。


原文地址: https://www.cveoy.top/t/topic/bWQl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录