You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by co...@apache.org on 2014/03/03 16:02:46 UTC
svn commit: r1573580 - in /httpd/httpd/branches/2.4.x: CHANGES STATUS
docs/manual/mod/mod_dir.xml modules/mappers/mod_dir.c
Author: covener
Date: Mon Mar 3 15:02:45 2014
New Revision: 1573580
URL: http://svn.apache.org/r1573580
Log:
Backport r1557639 r1557640 from trunk
restore http://svn.apache.org/viewvc?view=revision&revision=233369
under a configurable option: don't run mod_dir if r->handler is already set.
Backported by: covner
Reviewed By: jim, ylavic
Modified:
httpd/httpd/branches/2.4.x/CHANGES
httpd/httpd/branches/2.4.x/STATUS
httpd/httpd/branches/2.4.x/docs/manual/mod/mod_dir.xml
httpd/httpd/branches/2.4.x/modules/mappers/mod_dir.c
Modified: httpd/httpd/branches/2.4.x/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/CHANGES?rev=1573580&r1=1573579&r2=1573580&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/CHANGES [utf-8] (original)
+++ httpd/httpd/branches/2.4.x/CHANGES [utf-8] Mon Mar 3 15:02:45 2014
@@ -2,6 +2,9 @@
Changes with Apache 2.4.8
+ *) mod_dir: Add DirectoryCheckHandler to allow a 2.2-like behavior, skipping
+ execution when a handler is already set. PR53929. [Eric Covener]
+
*) mod_ssl: Do not perform SNI / Host header comparison in case of a
forward proxy request. [Ruediger Pluem]
Modified: httpd/httpd/branches/2.4.x/STATUS
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/STATUS?rev=1573580&r1=1573579&r2=1573580&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/STATUS (original)
+++ httpd/httpd/branches/2.4.x/STATUS Mon Mar 3 15:02:45 2014
@@ -98,15 +98,6 @@ RELEASE SHOWSTOPPERS:
PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
[ start all new proposals below, under PATCHES PROPOSED. ]
- * mod_dir: provide a directive to skip mod_dir processing if any other
- handler has been configured, as in 2.2.
- trunk patch: http://svn.apache.org/r1557639
- http://svn.apache.org/r1557640
- 2.4.x patch: http://people.apache.org/~covener/patches/2.4.x-moddir-skiphandler.diff
- +1: covener, jim, ylavic
- (I could be convinced to flip the default here, but I think it's too late)
-
-
PATCHES PROPOSED TO BACKPORT FROM TRUNK:
[ New proposals should be added at the end of the list ]
Modified: httpd/httpd/branches/2.4.x/docs/manual/mod/mod_dir.xml
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/docs/manual/mod/mod_dir.xml?rev=1573580&r1=1573579&r2=1573580&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/docs/manual/mod/mod_dir.xml (original)
+++ httpd/httpd/branches/2.4.x/docs/manual/mod/mod_dir.xml Mon Mar 3 15:02:45 2014
@@ -276,5 +276,31 @@ later</compatibility>
</highlight>
</usage>
</directivesynopsis>
+<directivesynopsis>
+<name>DirectoryCheckHandler</name>
+<description>Toggle how this module responds when another handler is configured</description>
+<syntax>DirectoryCheckHandler On|Off</syntax>
+<default>DirectorySlash Off</default>
+<contextlist><context>server config</context><context>virtual host</context>
+<context>directory</context><context>.htaccess</context></contextlist>
+<override>Indexes</override>
+<compatibility>Available in 2.4.8 and later. Releases prior to 2.4 implicitly
+act as if "DirectorySlash Off" was specified.</compatibility>
+<usage>
+ <p>The <directive>DirectoryCheckHandler</directive> directive determines
+ whether <module>mod_dir</module> should check for directory indexes or
+ add trailing slashes when some other handler has been configured for
+ the current URL. Handlers can be set by directives such as
+ <directive module="core">SetHandler</directive> or by other modules,
+ such as <module>mod_rewrite</module> during per-directory substitutions.
+ </p>
+
+ <p> In releases prior to 2.4, this module did not take any action if any
+ other handler was configured for a URL. This allows directory indexes to
+ be served even when a <directive>SetHandler</directive> directive is
+ specified for an entire directory, but it can also result in some conflicts
+ with modules such as <directive>mod_rewrite</directive>.</p>
+</usage>
+</directivesynopsis>
</modulesynopsis>
Modified: httpd/httpd/branches/2.4.x/modules/mappers/mod_dir.c
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/modules/mappers/mod_dir.c?rev=1573580&r1=1573579&r2=1573580&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/modules/mappers/mod_dir.c (original)
+++ httpd/httpd/branches/2.4.x/modules/mappers/mod_dir.c Mon Mar 3 15:02:45 2014
@@ -34,17 +34,18 @@
module AP_MODULE_DECLARE_DATA dir_module;
typedef enum {
- SLASH_OFF = 0,
- SLASH_ON,
- SLASH_UNSET
-} slash_cfg;
+ MODDIR_OFF = 0,
+ MODDIR_ON,
+ MODDIR_UNSET
+} moddir_cfg;
#define REDIRECT_OFF 0
#define REDIRECT_UNSET 1
typedef struct dir_config_struct {
apr_array_header_t *index_names;
- slash_cfg do_slash;
+ moddir_cfg do_slash;
+ moddir_cfg checkhandler;
int redirect_index;
const char *dflt;
} dir_config_rec;
@@ -84,7 +85,14 @@ static const char *configure_slash(cmd_p
{
dir_config_rec *d = d_;
- d->do_slash = arg ? SLASH_ON : SLASH_OFF;
+ d->do_slash = arg ? MODDIR_ON : MODDIR_OFF;
+ return NULL;
+}
+static const char *configure_checkhandler(cmd_parms *cmd, void *d_, int arg)
+{
+ dir_config_rec *d = d_;
+
+ d->checkhandler = arg ? MODDIR_ON : MODDIR_OFF;
return NULL;
}
static const char *configure_redirect(cmd_parms *cmd, void *d_, const char *arg1)
@@ -124,6 +132,8 @@ static const command_rec dir_cmds[] =
"a list of file names"),
AP_INIT_FLAG("DirectorySlash", configure_slash, NULL, DIR_CMD_PERMS,
"On or Off"),
+ AP_INIT_FLAG("DirectoryCheckHandler", configure_checkhandler, NULL, DIR_CMD_PERMS,
+ "On or Off"),
AP_INIT_TAKE1("DirectoryIndexRedirect", configure_redirect,
NULL, DIR_CMD_PERMS, "On, Off, or a 3xx status code."),
@@ -135,7 +145,8 @@ static void *create_dir_config(apr_pool_
dir_config_rec *new = apr_pcalloc(p, sizeof(dir_config_rec));
new->index_names = NULL;
- new->do_slash = SLASH_UNSET;
+ new->do_slash = MODDIR_UNSET;
+ new->checkhandler = MODDIR_UNSET;
new->redirect_index = REDIRECT_UNSET;
return (void *) new;
}
@@ -148,7 +159,9 @@ static void *merge_dir_configs(apr_pool_
new->index_names = add->index_names ? add->index_names : base->index_names;
new->do_slash =
- (add->do_slash == SLASH_UNSET) ? base->do_slash : add->do_slash;
+ (add->do_slash == MODDIR_UNSET) ? base->do_slash : add->do_slash;
+ new->checkhandler =
+ (add->checkhandler == MODDIR_UNSET) ? base->checkhandler : add->checkhandler;
new->redirect_index=
(add->redirect_index == REDIRECT_UNSET) ? base->redirect_index : add->redirect_index;
new->dflt = add->dflt ? add->dflt : base->dflt;
@@ -266,6 +279,10 @@ static int fixup_dir(request_rec *r)
return DECLINED;
}
+ if (d->checkhandler == MODDIR_ON && strcmp(r->handler, DIR_MAGIC_TYPE)) {
+ return DECLINED;
+ }
+
if (d->index_names) {
names_ptr = (char **)d->index_names->elts;
num_names = d->index_names->nelts;