为什么在我的Apache 2.2模块中调用ap_hook_type_checker函数时,request_rec :: filename为NULL?

时间:2011-08-19 00:17:06

标签: c++ linux apache ubuntu

我有一个在CentOS上正常运行的Apache模块,但在Ubuntu上失败了。我已经跟踪问题,因为请求记录包含request_rec结构中的文件名的NULL值,Apache将其作为参数传递给我在模块中定义的钩子函数以检查文件正在处理的文件的类型。

即,

extern "C" module AP_MODULE_DECLARE_DATA  MyModule = {
STANDARD20_MODULE_STUFF,     // initializer
NULL,                        // create per-dir config
NULL,                        // merge per-dir config
NULL,                        // server config
NULL,                        // merge server config
MyCommandTable,              // command table
MyRegisterHooks              // register hooks
};

...与

static void MyRegisterHooks(apr_pool_t *p)
{
ap_hook_child_init(MyPluginInit, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_type_checker(MyCheckAppFileType, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_handler(MyFileHandler,NULL,NULL,APR_HOOK_MIDDLE);
}

......最后,罪魁祸首:

static int MyCheckAppFileType(request_rec *ap_req)
{
if(ap_req == NULL)
{
    return DECLINED; // Not reached
}

if(ap_req->filename == NULL)
{
    return DECLINED; // HERE is the problem ... Why is ap_req->filename NULL?
                     // On CentOS it is not NULL, only on Ubuntu.
}

    // ...
}

我在Ubuntu和CentOS上使用Apache 2.2,我在两个系统上独立构建了模块。

进一步的信息~3个月后: 我发现在CentOS上构建模块,然后将二进制文件复制到Ubuntu,它就可以了。获取相同的代码并在Ubuntu上构建它会导致上述运行时失败。因此,代码似乎不一定是问题 - 或者至少在两个系统上由编译器处理的事情不同,导致CentOS构建成功但不是Ubuntu构建成功。

1 个答案:

答案 0 :(得分:0)

我刚才遇到了一个几乎完全相同的问题。我正在使用别人写的模块。在一台测试机器上,模块正在正确执行authN和authZ。在auth检查程序挂钩内的r->filename不同的机器NULL。您的问题首先出现在我的谷歌搜索中。

在我的情况下,我将其追踪到错误使用ap_set_module_config。代码看起来像:

ap_set_module_config(r, &auth_my_module, attrs);

ap_set_module_config的源代码说明了这一点:

/**
 * Generic accessors for other modules to set at their own module-specific
 * data
 * @param conf_vector The vector in which the modules configuration is stored.
 *        usually r->per_dir_config or s->module_config
 * @param m The module to set the data for.
 * @param val The module-specific data to set
 */
AP_DECLARE(void) ap_set_module_config(ap_conf_vector_t *cv, const module *m,
                                      void *val);

我将对ap_set_module_config的调用更改为:

ap_set_module_config(r->per_dir_config, &auth_my_module, attrs);

就像魔术一样,r->filename在auth checker钩子中不再是NULL。我是新手编写apache模块所以我需要找出这意味着什么,但我很高兴我找出了问题所在。您可以查看代码,了解如何拨打ap_set_module_config

编辑:我应该补充一点,我通过添加调试语句来跟踪这一点,这些语句向我展示了filename结构的request_rec字段成为NULL的确切时间。对我来说,它在我定义的钩子里从有效到NULL

祝你好运!