我可以使用自定义 apache 模块读取输出数据,但不能读取 http 标头


I can read output data but not http header with using custom apache module

我来这里问,因为我在任何地方都找不到任何关于如何编写一个模块的明确文档,该模块可以读取从 apache 执行的任何第三方脚本(例如 PHP 脚本)传递的 HTTP 标头(尤其是状态代码)。到目前为止,我可以使用此代码来获取 HTML 输出的内容,并在error_log中记下它:

static apr_status_t outfilter(ap_filter_t *f,apr_bucket_brigade *pbbIn){
    const char *data;
    apr_size_t len;
    apr_bucket *pbktIn=APR_BRIGADE_FIRST(pbbIn);
    apr_bucket_read(pbktIn,&data,&len,APR_BLOCK_READ);
    request_rec *r=f->r;server_rec *s=r->server;
    ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, "SAMPLE: DATA READ: %s",data);
    return ap_pass_brigade(f->next,pbbIn);
}
static int addfilt(request_rec *r){
ap_add_output_filter("block:filt",NULL,r,r->connection);
}
static void register_hooks(apr_pool_t *pool){
    ap_hook_insert_filter(addfilt,NULL,NULL,APR_HOOK_MIDDLE);
    ap_register_output_filter("block:filt",outfilter,NULL,AP_FTYPE_RESOURCE);
}
module AP_MODULE_DECLARE_DATA sample_module={
    STANDARD20_MODULE_STUFF,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    register_hooks
}

我想读取状态,因为我想阻止潜在的脚本小子有时每秒用 20+ 个请求淹没我的日志,这些请求指向服务器上不存在的项目。

知道我如何读取状态吗?即使读取整个 http 标头的前 10 或 20 个字节也足够了。

状态代码处于 r->status 中,响应标头位于表 r->headers_out 和 r->err_headers_out 中。这里有一个简单的提示 - 如果CustomLog可以记录您感兴趣的内容,只需阅读mod_log_config.c即可了解如何在给定request_rec的情况下访问它。

好的,我刚刚从实验中发现了答案,我需要将 AP_FTYPE_RESOURCE 作为寄存器过滤器函数的最后一个参数更改为 AP_FTYPE_CONNECTION。