Hi list,
I'm using RewriteRule to remove the query string. Using this very simple
rule:
RewriteRule /foo /bar? [R,L]

results in
GET /foo?quux ->
GET /bar?

The redirect includes a spurious question mark, I expected it to be
GET /foo?quux ->
GET /bar

(tested on tomcat 8.5.15)

Looking at the code
(java/org/apache/catalina/valves/rewrite/RewriteValve.java),
It looks buggy:

                    int index = urlStringDecoded.indexOf("?");
[..] snip  [..]
                        urlStringDecoded = urlStringDecoded.substring(0,
index);
                        urlStringEncoded =
URLEncoder.DEFAULT.encode(urlStringDecoded,
uriCharset)
[..] snip [..]
                            } else if (index == urlStringEncoded.length() -
1) {
                                // if the ? is the last character delete
it, its only purpose was to
                                // prevent the rewrite module from
appending the query string
                                urlStringEncoded.deleteCharAt(index);
                            }
>From what I understand, the last block is dead code because
urlStringEncoded is the substring of the original up to index *excluded*,
so index can never been equal to urlStringEncoded.length() - 1

The code then proceeds and adds the spurious question mark to the result.

Can anyone confirm this or did I miss something ?

Cheers,
Jon

ps: The code is also wrong in comparing the index of '?' in the *decoded*
string to the length of the *encoded* string, but that's another matter.

Jon
Jon

Reply via email to