3

Apache httpd 框架中是否有任何机制允许我将自定义参数从 Apache 配置文件传递到自定义 Apache 模块(使用 C API 编写)?我真的只需要键/值对。

类似于 conf 文件中的内容:

ConfigParameter foo bar

然后在代码中:

string foo = GetApacheConfigParameter("foo"); // = "bar"
4

1 回答 1

5

不; 不直接。一个肮脏的黑客将是

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 等 有很好的例子。

于 2012-11-19T20:42:45.617 回答