Per-Directory Configuration
It is also possible for modules to
be configured on a per-directory, per-URL, or per-file basis. Again,
each module optionally creates its own per-directory configuration
(the same structure is used for all three cases). This configuration
is made available to modules either directly (during configuration)
or indirectly (once the server is running), through the
request_rec structure, which is detailed in the
next section.
Note that the module doesn’t care how the configuration has been set up in terms of servers, directories, URLs, or file matches — the core of the server works out the appropriate configuration for the current request before modules are called by merging the appropriate set of configurations.
The method differs from per-server configuration, so here’s an example, taken this time from the standard module, modules/metadata/mod_expires.c:
typedef struct {
int active;
char *expiresdefault;
apr_table_t *expiresbytype;
} expires_dir_config;First we have a per-directory configuration structure:
static void *create_dir_expires_config(apr_pool_t *p, char *dummy)
{
expires_dir_config *new =
(expires_dir_config *) apr_pcalloc(p, sizeof(expires_dir_config));
new->active = ACTIVE_DONTCARE;
new->expiresdefault = "";
new->expiresbytype = apr_table_make(p, 4);
return (void *) new;
}This is the function that creates it, which will be linked from the
module structure, as usual. Note that the active member is set to a default that can’t be set by directives ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access