http://qs321.pair.com?node_id=908304

stevee has asked for the wisdom of the Perl Monks concerning the following question:

Hi all

I have a simple perl cgi script which redirects quite happily:

#!C:\perl\bin\perl.exe -wT use strict; use CGI qw/:standard/; my $cgi = new CGI; print $cgi->redirect( -uri => 'http://perl.about.com/' );

trying to do the same in another script (relevant bits below)

if ($match==1) { my $r=new CGI; print $r->redirect( -uri => 'http://perl.about.com/' ); }

results in a web page with my debug prints in which says

Got the following headers: HTTP_REMOTE_USER: setheri HTTP_HOST: localhost HTTP_USER_AGENT: Fiddler sid is setheri Entering user test Check of hash sid2 is setheri testing for existence Item is setheri we have a match Status: 302 Found Location: http://perl.about.com/

The script basically gets the HTTP header value REMOTE_USER and if that is in a given list redirects. Don't ask - forced to do it that way by system restrictions. Can anyone shed any light as to why the second redirect does not work?

Many thanks

Replies are listed 'Best First'.
Re: Problem with CGI.pm redirects
by Corion (Patriarch) on Jun 06, 2011 at 14:43 UTC

    Your debug prints confuse the webserver. Everything that you print to STDOUT goes to the client, and if the client does not see a HTTP header first, it assumes that it will get served plain text. Which is what happens with your output - at the bottom, there is the correct and expected Status: 302 line and the new location header.

    To solve this, don't output anything before printing the Status: line.

      ... or print your debug output to STDERR. warn does that by default.

      If you use Apache, the STDERR output of the script can be found in the error.log of your virtual host (typically /var/log/apache2/yourhost/error.log).

        Many thanks both, works a treat! And the tip about warn is very useful.

        Stevee