Looks like there is no further feedback on the below.
@Yann: Care to commit https://bz.apache.org/bugzilla/attachment.cgi?id=39832 ?
I would then commit my stuff below.

Regards

Rüdiger

On 8/20/24 5:20 PM, Ruediger Pluem wrote:
> 
> 
> On 8/20/24 2:32 PM, Eric Covener wrote:
>> On Tue, Aug 20, 2024 at 8:12 AM Ruediger Pluem <rpl...@apache.org> wrote:
>>>
>>>
>>>
>>> On 8/20/24 1:44 PM, Eric Covener wrote:
>>>> 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.
>>>
>>> But people seem to use [P,NE] e.g 
>>> https://bz.apache.org/bugzilla/show_bug.cgi?id=69260
>>> Shouldn't we ensure that it does what people expect at least in 2.4.x?
>>
>> True. I guess we can say e.g. "When used with [P], [NE] prevents
>> mod_proxy from escaping the substitution.  mod_rewrite does not
>> implicitly escape the substitution when the [P] flag is used"
>>
>>> What else should people do? proxy-nocanon is a note and not an environment 
>>> variable. Hence I guess
>>> they have no other option with a RewriteRule.
>>
>> I didn't appreciate the note-vs-envvar, good point.
>>
>>>
>>>>
>>>>>
>>>>>>
>>>>>>> +
>>>>>>> +            /* 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])
>>>
>>> How about the below instead?
>>>
>>>            /* 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 add the QUERY_STRING
>>
>>
>> /* make sure the QUERY_STRING gets incorporated in the case [NE] was 
>> specified
>>  *  on the Proxy rule. We are preventing mod_proxy canon handler from
>>  *  incorporating r->args as well as escaping the URL.
>>  */
>>
>>>
>>>>
>>>>>
>>>>>>
>>>>>>
>>>>>>>               * (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.
>>>>
>>>
>>> I will do so and post a new version of the patch here.
> 
> 
> New version of patch:
> 
> 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",
> @@ -5089,7 +5075,7 @@
>              }
>              if ((r->args != NULL)
>                  && ((r->proxyreq == PROXYREQ_PROXY)
> -                    || (rulestatus == ACTION_NOESCAPE))) {
> +                    || apr_table_get(r->notes, "proxy-nocanon"))) {
>                  /* see proxy_http:proxy_http_canon() */
>                  r->filename = apr_pstrcat(r->pool, r->filename,
>                                            "?", r->args, NULL);
> @@ -5392,13 +5378,18 @@
>                  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");
> +            }
> +
> +            /* make sure the QUERY_STRING gets incorporated in the case
> +             * [NE] was specified on the Proxy rule. We are preventing
> +             * mod_proxy canon handler from incorporating r->args as well
> +             * as escaping the URL.
>               * (r->path_info was already appended by the
>               * rewriting engine because of the per-dir context!)
>               */
> -            if (r->args != NULL) {
> -                /* see proxy_http:proxy_http_canon() */
> +            if ((r->args != NULL) && apr_table_get(r->notes, 
> "proxy-nocanon")) {
>                  r->filename = apr_pstrcat(r->pool, r->filename,
>                                            "?", r->args, NULL);
>              }
> 
> 
> Regards
> 
> Rüdiger
> 
> 

Reply via email to