Item8186: Infinite redirect loop when using Jump box and short urls

pencil
Priority: Low
Current State: New
Released In: n/a
Target Release: n/a
Applies To: Extension
Component: RedirectPlugin
Branches:
Reported By: Foswiki:Main.JeffVStein
Waiting For:
Last Change By: BenjaminMartin

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
 

ItemTemplate edit

Summary Infinite redirect loop when using Jump box and short urls
ReportedBy Foswiki:Main.JeffVStein
Codebase 1.0.5, trunk
SVN Range Foswiki-1.0.0, Thu, 08 Jan 2009, build 1878
AppliesTo Extension
Component RedirectPlugin
Priority Low
CurrentState New
WaitingFor
Checkins
TargetRelease n/a
ReleasedIn n/a
CheckinsOnBranches
trunkCheckins
masterCheckins
ItemBranchCheckins
Release01x01Checkins
Topic revision: r5 - 04 Mar 2015, BenjaminMartin
The copyright of the content on this website is held by the contributing authors, except where stated elsewhere. See Copyright Statement. Creative Commons License    Legal Imprint    Privacy Policy