Changes with Apache 2.3.1
[ When backported to 2.2.x, remove entry from this file ]
+ *) mod_rewrite: Introduce DiscardPathInfo|DPI flag to stop the troublesome
+ way that per-directory rewrites append the previous notion of PATH_INFO
+ to each substitution before evaluating subsequent rules.
+ PR38642 [Eric Covener]
+
*) mod_cgid: Do not add an empty argument when calling the CGI script.
PR 46380 [Ruediger Pluem]
<code>HttpOnly</code> flag is used, making the cookie inaccessible
to JavaScript code on browsers that support this feature.</dd>
+ <dt>'<code>discardpathinfo|DPI'
+ (discard PATH_INFO)</code></dt><dd>
+ <p>In per-directory context, the URI each <code class="directive">RewriteRule</code>
+ compares against is the concatenation of the current values of the URI
+ and PATH_INFO.</p>
+
+ <p>The current URI can be the initial URI as requested by the client, the
+ result of a previous round of mod_rewrite processing, or the resulf of
+ a prior rule in the current round of mod_rewrite processing.</p>
+
+ <p>In contrast, the PATH_INFO that is appended to the URI before each
+ rule reflects only the value of PATH_INFO before this round of
+ mod_rewrite processing. As a consequence, if large portions
+ of the URI are matched and copied into a substitution in multiple
+ <code class="directive">RewriteRule</code> directives, without regard for
+ which parts of the URI came from the current PATH_INFO, the final
+ URI may have multiple copies of PATH_INFO appended to it.</p>
+
+ <p>Use this flag on any substitution where the PATH_INFO that resulted
+ from the previous mapping of this request to the filesystem is not of
+ interest. This flag permanently forgets the PATH_INFO established
+ before this round of mod_rewrite processing began. PATH_INFO will
+ not be recalculated until the current round of mod_rewrite processing
+ completes. Subsequent rules during this round of processing will see
+ only the direct result of substitutions, without any PATH_INFO
+ appended.</p></dd>
+
<dt>
'<code>env|E=</code><em>VAR</em>:<em>VAL</em>'
(set environment variable)</dt><dd>
<code>HttpOnly</code> flag is used, making the cookie inaccessible
to JavaScript code on browsers that support this feature.</dd>
+ <dt>'<code>discardpathinfo|DPI'
+ (discard PATH_INFO)</code></dt><dd>
+ <p>In per-directory context, the URI each <directive>RewriteRule</directive>
+ compares against is the concatenation of the current values of the URI
+ and PATH_INFO.</p>
+
+ <p>The current URI can be the initial URI as requested by the client, the
+ result of a previous round of mod_rewrite processing, or the resulf of
+ a prior rule in the current round of mod_rewrite processing.</p>
+
+ <p>In contrast, the PATH_INFO that is appended to the URI before each
+ rule reflects only the value of PATH_INFO before this round of
+ mod_rewrite processing. As a consequence, if large portions
+ of the URI are matched and copied into a substitution in multiple
+ <directive>RewriteRule</directive> directives, without regard for
+ which parts of the URI came from the current PATH_INFO, the final
+ URI may have multiple copies of PATH_INFO appended to it.</p>
+
+ <p>Use this flag on any substitution where the PATH_INFO that resulted
+ from the previous mapping of this request to the filesystem is not of
+ interest. This flag permanently forgets the PATH_INFO established
+ before this round of mod_rewrite processing began. PATH_INFO will
+ not be recalculated until the current round of mod_rewrite processing
+ completes. Subsequent rules during this round of processing will see
+ only the direct result of substitutions, without any PATH_INFO
+ appended.</p></dd>
+
<dt>
'<code>env|E=</code><em>VAR</em>:<em>VAL</em>'
(set environment variable)</dt><dd>
#define RULEFLAG_NOSUB 1<<12
#define RULEFLAG_STATUS 1<<13
#define RULEFLAG_ESCAPEBACKREF 1<<14
+#define RULEFLAG_DISCARDPATHINFO 1<<15
/* return code of the rewrite rule
* the result may be escaped - or not
++error;
}
break;
-
+ case 'd':
+ case 'D':
+ if (!*key || !strcasecmp(key, "PI") || !strcasecmp(key,"iscardpath")) {
+ cfg->flags |= (RULEFLAG_DISCARDPATHINFO);
+ }
+ break;
case 'e':
case 'E':
if (!*key || !strcasecmp(key, "nv")) { /* env */
++error;
}
break;
-
case 'l':
case 'L':
if (!*key || !strcasecmp(key, "ast")) { /* last */
/* Now adjust API's knowledge about r->filename and r->args */
r->filename = newuri;
+
+ if (ctx->perdir && (p->flags & RULEFLAG_DISCARDPATHINFO)) {
+ r->path_info = "\0";
+ }
+
splitout_queryargs(r, p->flags & RULEFLAG_QSAPPEND);
/* Add the previously stripped per-directory location prefix, unless