否;不直接。一個骯髒的黑客會
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 et.al.有很好的例子。
你的第一個解決方案(SetEnv)不起作用,因爲它似乎沒有在我的模塊中運行childinit鉤子時執行。我最終通過爲我的模塊創建了一個單獨的配置文件來解決這個問題。 –