On Tue, Aug 20, 2024 at 4:41 AM Ruediger Pluem <rpl...@apache.org> wrote: > > > > On 8/19/24 2:14 PM, Eric Covener wrote: > >> > >> Maybe reverting r757427 > >> (https://svn.apache.org/viewvc?view=revision&revision=757427) fixes this. > >> My new patch sofar: > >> > >> Index: modules/mappers/mod_rewrite.c > >> =================================================================== > >> --- modules/mappers/mod_rewrite.c (revision 1920017) > >> +++ modules/mappers/mod_rewrite.c (working copy) > >> @@ -4527,20 +4527,6 @@ > >> * ourself). > >> */ > >> if (p->flags & RULEFLAG_PROXY) { > >> - /* For rules evaluated in server context, the mod_proxy fixup > >> - * hook can be relied upon to escape the URI as and when > >> - * necessary, since it occurs later. If in directory context, > >> - * the ordering of the fixup hooks is forced such that > >> - * mod_proxy comes first, so the URI must be escaped here > >> - * instead. See PR 39746, 46428, and other headaches. */ > >> - if (ctx->perdir && (p->flags & RULEFLAG_NOESCAPE) == 0) { > >> - char *old_filename = r->filename; > >> - > >> - r->filename = ap_escape_uri(r->pool, r->filename); > >> - rewritelog(r, 2, ctx->perdir, "escaped URI in per-dir context > >> " > >> - "for proxy, %s -> %s", old_filename, r->filename); > >> - } > >> - > >> fully_qualify_uri(r); > >> > >> rewritelog(r, 2, ctx->perdir, "forcing proxy-throughput with %s", > >> @@ -5392,12 +5378,17 @@ > >> return HTTP_FORBIDDEN; > >> } > >> > >> - /* make sure the QUERY_STRING and > >> - * PATH_INFO parts get incorporated > >> + if (rulestatus == ACTION_NOESCAPE) { > >> + apr_table_setn(r->notes, "proxy-nocanon", "1"); > >> + } > > > > This seems to preserve 2.4.58 behavior of [P,NE] in per-dir. > > We should re-document NE in this context though > > I am not sure what you mean here.
Sorry, I originally had a copy of the description from the manual. Current doc for [NE] talks about internal redirects only. > > > > >> + > >> + /* make sure the QUERY_STRING gets incorporated, but only > >> + * if we do not escape the target. Otherwise the mod_proxy > >> + * canon handler will take care to do this. > > > > nit: I don't think we will ever escape the target later though [in > > mod_rewrite]. > > What the comment wants to say is that we only need to add the QUERY_STRING if > we do no escape the target. In case we escape the > target the QUERY_STRING gets added by the canon handler. Right, but I think it's misleading because there is no more escaping to come in mod_rewrite along this path (much less any controlled by [NE]) > > > > > > >> * (r->path_info was already appended by the > >> * rewriting engine because of the per-dir context!) > >> */ > >> - if (r->args != NULL) { > >> + if ((r->args != NULL) && (rulestatus == ACTION_NOESCAPE)) { > >> /* see proxy_http:proxy_http_canon() */ > >> r->filename = apr_pstrcat(r->pool, r->filename, > >> "?", r->args, NULL); > > > > nit: It might be more clear here to check (or memoize) proxy-nocanon > > directly, for the same confusion as above. > > > > You mean replace (rulestatus == ACTION_NOESCAPE) with apr_table_get(r->notes, > "proxy-nocanon") ? I think so, or alternatively remove any significance of [NE] for proxy.