to a local URL-path with the INCLUDES filter active, introduced
in 2.4.11. PR 57531. [Yann Ylavic]
+ *) mod_rewrite: Add support for starting External Rewriting Programs
+ as non-root user on UNIX systems by specifying username and group name
+ as third argument of RewriteMap directive. [Jan Kaluza]
+
*) core: If explicitly configured, use the KeepaliveTimeout value of the
virtual host which handled the latest request on the connection, or by
default the one of the first virtual host bound to the same IP:port.
module="mod_rewrite">RewriteEngine</directive> set to
<code>on</code>.</p>
+ <p>By default, external rewriting programs are started as root.
+ This can be changed on UNIX systems by passing user name and
+ group name as third argument to <directive module="mod_rewrite">
+ RewriteMap</directive> in the <code>username:groupname</code> format.</p>
+
<p>This feature utilizes the <code>rewrite-map</code> mutex,
which is required for reliable communication with the program.
The mutex mechanism and lock file can be configured with the
<p><strong>Rewrite configuration</strong></p>
<highlight language="config">
-RewriteMap d2u prg:/www/bin/dash2under.pl<br />
+RewriteMap d2u prg:/www/bin/dash2under.pl apache:apache<br />
RewriteRule - ${d2u:%{REQUEST_URI}}
</highlight>
const char *dbdq; /* SQL SELECT statement for rewritemap */
const char *checkfile2; /* filename to check for map existence
NULL if only one file */
+ const char *user; /* run RewriteMap program as this user */
+ const char *group; /* run RewriteMap program as this group */
} rewritemap_entry;
/* special pattern types for RewriteCond */
static apr_status_t rewritemap_program_child(apr_pool_t *p,
const char *progname, char **argv,
+ const char *user, const char *group,
apr_file_t **fpout,
apr_file_t **fpin)
{
APR_FULL_BLOCK, APR_NO_PIPE))
&& APR_SUCCESS == (rc=apr_procattr_dir_set(procattr,
ap_make_dirstr_parent(p, argv[0])))
+ && (!user || APR_SUCCESS == (rc=apr_procattr_user_set(procattr, user, "")))
+ && (!group || APR_SUCCESS == (rc=apr_procattr_group_set(procattr, group)))
&& APR_SUCCESS == (rc=apr_procattr_cmdtype_set(procattr, APR_PROGRAM))
&& APR_SUCCESS == (rc=apr_procattr_child_errfn_set(procattr,
rewrite_child_errfn))
}
rc = rewritemap_program_child(p, map->argv[0], map->argv,
+ map->user, map->group,
&fpout, &fpin);
if (rc != APR_SUCCESS || fpin == NULL || fpout == NULL) {
ap_log_error(APLOG_MARK, APLOG_ERR, rc, s, APLOGNO(00654)
}
static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1,
- const char *a2)
+ const char *a2, const char *a3)
{
rewrite_server_conf *sconf;
rewritemap_entry *newmap;
newmap->type = MAPTYPE_PRG;
newmap->checkfile = newmap->argv[0];
+ if (a3) {
+ char *tok_cntx;
+ newmap->user = apr_strtok(apr_pstrdup(cmd->pool, a3), ":", &tok_cntx);
+ newmap->group = apr_strtok(NULL, ":", &tok_cntx);
+ }
}
else if (strncasecmp(a2, "int:", 4) == 0) {
newmap->type = MAPTYPE_INT;
"an input string and a to be applied regexp-pattern"),
AP_INIT_RAW_ARGS("RewriteRule", cmd_rewriterule, NULL, OR_FILEINFO,
"an URL-applied regexp-pattern and a substitution URL"),
- AP_INIT_TAKE2( "RewriteMap", cmd_rewritemap, NULL, RSRC_CONF,
- "a mapname and a filename"),
+ AP_INIT_TAKE23( "RewriteMap", cmd_rewritemap, NULL, RSRC_CONF,
+ "a mapname and a filename and options"),
{ NULL }
};