[Rt-devel] RT::Interface::Web::Redirect() broken (for 3.6) in split front/back proxying setup

Jesse Vincent jesse at bestpractical.com
Mon Jun 18 12:07:32 EDT 2007

On Jun 15, 2007, at 4:20 PM, Chris Stromsoe wrote:

> RT::Interface::Web::Redirect() is broken for a split front-end  
> proxy / back-end RT setup.
> I'm running multiple instances of RT spread over several backend  
> servers. They're all accessible through a single set of front-end  
> proxies that use a combination of different ports and paths (though  
> for these purposes they could also use different hostnames) to  
> direct access to the correct backend.
> As an example, the url https://rt-front.domain:8888/rt99/ might  
> proxy through to https://rt-back.otherdoman:8080/rt-customer-x/
> I'm finding that some times when Redirect() is called, it is  
> sending a redirect back out to the client trying to redirect to the  
> back-end hostname and port.
> Redirect looks like this:
> sub Redirect {
>     my $redir_to = shift;
>     untie $HTML::Mason::Commands::session;
>     my $uri = URI->new($redir_to);
>     my $server_uri = URI->new($RT::WebURL);
>     # If the user is coming in via a non-canonical
>     # hostname, don't redirect them to the canonical host,
>     # it will just upset them (and invalidate their credentials)
>     if ($uri->host  eq $server_uri->host &&
>         $uri->port eq $server_uri->port) {
>             $uri->host($ENV{'HTTP_HOST'});
>             $uri->port($ENV{'SERVER_PORT'});
>         }
>     $HTML::Mason::Commands::m->redirect($uri->canonical);
>     $HTML::Mason::Commands::m->abort;
> }
> If I comment out the calls to $uri->host() and $uri->port()  
> everything works fine.  I'm using 3.6.1 as shipped with Debian  
> stable.  Based on at least one comment in the archives from back in  
> April or May, it sounds like this also happens with 3.6.3.  I have  
> not looked at 3.6.4 release candidates to see if the same code exists.

The behaviour is the same with 3.6.4. (And we're too late to change  
it now. We're only looking at things that are regressions from 3.6.3  
at this point.

I agree that the current behaviour is broken for split frontend/ 
backend setups. That's not ever been something we've explicitly  
supported, but it's not something I want to not support. That is to  
say "I want it to work right for everybody."

So, let's get a solution worked out.

The current code has a special case of "If we are redirecting to a  
URL that appears to be a 'canonical' RT URL and hit RT through  
something that appears to be non-canonical, for the love of god,  
don't redirect them. (When we do, they get asked to log in again  
because their cookie is for another domain)  Unfortunately, that  
directly conflicts with the backend-server case, where RT is running  
on a server and port that shouldn't be advertised.

> Can the code block be changed to refer to set variables in  
> RT_SiteConfig.pm instead of the environment hash?  Or to check for  
> something that was set intentionally?  Or to check if the redirect  
> should always be to the canonical name?
So yeah, I think that a config file flag for "always canonicalize on  
redirct" would be a welcome patch for 3.6.5. Is that something you  
can whip up?


-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 186 bytes
Desc: This is a digitally signed message part
Url : http://lists.bestpractical.com/pipermail/rt-devel/attachments/20070618/8c69bea6/PGP.pgp

More information about the Rt-devel mailing list