Apache httpd 框架中是否有任何机制允许我将自定义参数从 Apache 配置文件传递到自定义 Apache 模块(使用 C API 编写)?我真的只需要键/值对。
类似于 conf 文件中的内容:
ConfigParameter foo bar
然后在代码中:
string foo = GetApacheConfigParameter("foo"); // = "bar"
不; 不直接。一个肮脏的黑客将是
SetEnv foo bar
在配置文件中 - 和一个
char * bar = getenv("foo");
在你的模块中。除此之外的任何事情都需要在每个目录、服务器等上使用适当的结构。通常该结构将包含许多特定的东西。在你的情况下,它只是一张桌子。
所以有点干净的方法是简单地使用一张桌子——然后把它留在那:
static const command_rec xxx_cmds[] = {
AP_INIT_TAKE2("ConfigParameter", add_configparam, NULL, RSRC_CONF,
"Arbitrary key value pair"),
{NULL}
};
static void * create_dir_config(apr_pool_t *p, char *dirspec ) {
return ap_table_palloc(p);
}
static const char *add_configparam(cmd_parms *cmd, void *mconfig,
char *key, char *val)
{
ap_table_t *pairs = (ap_table_rec *) mconfig;
ap_table_set(pairs, key, val);
return NULL;
}
AP_DECLARE_MODULE(xxxx_module) =
{
STANDARD20_MODULE_STUFF,
xxx_create_dir_config, /* per-directory config creator */
...
xxx_cmds, /* command table */
然后,在任何你想使用它的地方:
apr_table_t * pairs = (apr_table_p *) ap_get_module_config(r->request_config, &xxxx_module);
或者
apr_table_t * pairs = ap_get_module_config(s->module_config, &xxxx_module);
取决于我们在哪里使用 - 然后使用:
char * bar = apr_table_get(pairs,"foo");
或类似的。请参阅 mod_example_hooks 和各种 our_* 调用以获取指针。上面的示例省略了服务器级别的配置和配置的合并。如果需要,请添加它们 - 对表有相应的合并调用。mod_alias.c 等 有很好的例子。