Item8186: Infinite redirect loop when using Jump box and short urls
Priority: Low
Current State: New
Released In: n/a
Target Release: n/a
Description
When using
short urls, it's very easy to get into an infinite loop by putting a redirected topic into the Jump box at the top. This results in the following error in Firefox:
Redirect Loop
Firefox has detected that the server is redirecting the request for this address in a way that will never complete.
The browser has stopped trying to retrieve the requested item. The site is redirecting the request in a way that will never complete.
* Have you disabled or blocked cookies required by this site?
* NOTE: If accepting the site's cookies does not resolve the problem, it is likely a server configuration issue and not your computer.
Cause
The Jump box is a basic HTML form that goes against the current page, using the user input as the
topic
value. This gives you a request string like:
http://server/wiki/Main/CurrentPage?topic=RedirectingArticle
RedirectPlugin then looks up the destination url using
Foswiki::Func::getViewUrl
and then appends the query string to this value.
http://server/wiki/Main/RedirectedPage?topic=RedirectingArticle
The
topic
value at the end of the URL overrides the internal value and you get a redirect loop because
RedirectPlugin keeps passing the
topic
variable.
Solution
As mentioned on the
TWiki site for RedirectPlugin, you can modify the
/path/to/Foswiki/lib/Foswiki/Plugins/RedirectPlugin.pm
to omit the
topic
parameter.
Since
RedirectPlugin uses the internal
Foswiki::Func::getViewUrl
call, it shouldn't need to append the
topic
variable and it can probably always be omitted.
my $queryString = "";
my $param;
foreach my $param ( $query->param ) {
+ $param eq 'topic' and next;
$queryString .= "&" if $queryString;
$queryString .= "$param=" . $query->param("$param");
}
--
JeffVStein - 22 Jun 2009
Using Foswiki 1.1.9, I just added some lines to
/path/to/Foswiki/lib/Foswiki/Plugins/RedirectPlugin.pm
to prevent infinits loops.
my $queryString = "";
my $param;
+ my $oldvalue = "";
foreach my $param ( $query->param ) {
foreach my $value ( $query->param("$param") ) {
+ $oldvalue = "$param=" . $value;
+ last if $queryString =~ m{.*$oldvalue.*};
$queryString .= "&" if $queryString;
$queryString .= "$param=" . $value;
}
}
NOTE: could be optimized
After some hours this did not work anymore (why?). So I removed all those "foreach"-loops and the final $q variable.
Result:
jumps on redirect are fast and without errors, but lack the information of "?redirectedfrom=...".
--
BenjaminMartin - 03 Mar 2015