when no custom ErrorDocument is specified for status code 400.
[Eric Covener]
+ *) Core configuration: add AllowOverride option to treat syntax
+ errors in .htaccess as non-fatal. PR 52439 [Nick Kew, Jim Jagielski]
+
*) core: Fix memory consumption in core output filter with streaming
bucket types like CGI or PIPE. [Joe Orton, Stefan Fritsch]
module="mod_authz_host">Deny</directive> and <directive
module="mod_authz_host">Order</directive>).</dd>
+ <dt>Nonfatal</dt>
+
+ <dd>
+ Allow use of AllowOverride option to treat syntax errors in .htaccess as non-fatal.</dt>
+
<dt>Options[=<var>Option</var>,...]</dt>
<dd>
* ap_proxy_sec2hex(), ap_proxy_make_fake_req(),
* ap_proxy_strmatch_path, ap_proxy_strmatch_domain,
* ap_proxy_table_unmerge(), proxy_lb_workers.
+ * 20120109.0 (2.4.1-dev) Changes sizeof(overrides_t) in core config.
*/
#define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
#ifndef MODULE_MAGIC_NUMBER_MAJOR
-#define MODULE_MAGIC_NUMBER_MAJOR 20111203
+#define MODULE_MAGIC_NUMBER_MAJOR 20120109
#endif
#define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */
#define EXEC_ON_READ 256 /**< force directive to execute a command
which would modify the configuration (like including another
file, or IFModule */
+/* Flags to determine whether syntax errors in .htaccess should be
+ * treated as nonfatal (log and ignore errors)
+ */
+#define NONFATAL_OVERRIDE 512 /* Violation of AllowOverride rule */
+#define NONFATAL_UNKNOWN 1024 /* Unrecognised directive */
+#define NONFATAL_ALL (NONFATAL_OVERRIDE|NONFATAL_UNKNOWN)
+
/** this directive can be placed anywhere */
#define OR_ALL (OR_LIMIT|OR_OPTIONS|OR_FILEINFO|OR_AUTHCFG|OR_INDEXES)
typedef unsigned char allow_options_t;
-typedef unsigned char overrides_t;
+typedef unsigned int overrides_t;
/*
* Bits of info that go into making an ETag for a file
if(apr_table_get(parms->override_list, cmd->name) != NULL)
override_list_ok = 1;
- if ((parms->override & cmd->req_override) == 0 && !override_list_ok)
- return apr_pstrcat(parms->pool, cmd->name, " not allowed here", NULL);
+ if ((parms->override & cmd->req_override) == 0 && !override_list_ok) {
+ if (parms->override & NONFATAL_OVERRIDE) {
+ ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, parms->temp_pool,
+ APLOGNO(02295)
+ "%s in .htaccess forbidden by AllowOverride",
+ cmd->name);
+ return NULL;
+ }
+ else {
+ return apr_pstrcat(parms->pool, cmd->name,
+ " not allowed here", NULL);
+ }
+ }
parms->info = cmd->cmd_data;
parms->cmd = cmd;
if (ml == NULL) {
parms->err_directive = current;
- return apr_pstrcat(parms->pool, "Invalid command '",
- current->directive,
- "', perhaps misspelled or defined by a module "
- "not included in the server configuration",
- NULL);
+ if (parms->override & NONFATAL_UNKNOWN) {
+ ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, parms->temp_pool,
+ APLOGNO(02296) "Unknown directive %s "
+ "perhaps misspelled or defined by a module "
+ "not included in the server configuration", dir);
+ return NULL;
+ }
+ else {
+ return apr_pstrcat(parms->pool, "Invalid command '",
+ current->directive,
+ "', perhaps misspelled or defined by a module "
+ "not included in the server configuration",
+ NULL);
+ }
}
for ( ; ml != NULL; ml = ml->next) {
else if (!strcasecmp(w, "Indexes")) {
d->override |= OR_INDEXES;
}
+ else if (!strcasecmp(w, "Nonfatal")) {
+ if (!strcasecmp(v, "Override")) {
+ d->override |= NONFATAL_OVERRIDE;
+ }
+ else if (!strcasecmp(v, "Unknown")) {
+ d->override |= NONFATAL_UNKNOWN;
+ }
+ else if (!strcasecmp(v, "All")) {
+ d->override |= NONFATAL_ALL;
+ }
+ }
else if (!strcasecmp(w, "None")) {
d->override = OR_NONE;
}