in reply to cgi redirect (again)

If you are using Apache (as you've said), and you change that middle line to:
print $q->redirect("/cgi-bin/Auto.cgi");
then you will not see "Auto.cgi" in your browser's URI line as a result of this script. Instead, you will see the output of "Auto.cgi", but the original URL of the script you posted. That's called an internal redirect, and it works (unless "Auto.cgi" itself is also doing a redirect).

-- Randal L. Schwartz, Perl hacker
Be sure to read my standard disclaimer if this is a reply.

Replies are listed 'Best First'.
Re: Re: cgi redirect (again)
by Kanji (Parson) on Dec 03, 2002 at 15:50 UTC

    I haven't been able to find any reference documenting this behaviour, but I've never been able to force an internal redirect on Apache unless I omitted the Status: header (which redirect() adds by default) using...

    print $q->redirect( -status => "", -uri => "/cgi-bin/Auto.cgi" );
    ...or even...
    print "Location: /cgi-bin/Auto.cgi\n\n";

    Maybe you'll have better luck with one of these?

        --k.


      Aha! I found the culprit! You were spot on, although slightly confused. Apache does notice the status header of an internal redirect. Here's the code:
      location = ap_table_get(r->headers_out, "Location"); if (location && location[0] == '/' && r->status == 200) {
      So if there's a status, it has to be "200". Any other status, and the code falls through to sending the header out to the client instead (an external redirect).

      And there appears to be no-way to force a 200 status using CGI.pm's "redirect". {sigh}

      -- Randal L. Schwartz, Perl hacker
      Be sure to read my standard disclaimer if this is a reply.


      update: Ahh. I was wrong about CGI.pm. You can use
      print redirect(-uri => "/foo", -status => 200);
        Super, always pleased to learn new stuff.

        So what is happening is that the CGI.pm is sending headers to Apache to send back to the client. However Apache notices that the status is 200 and that there is a Location header and decides to issue a new request through itself for this location. So until the new location's data is grabbed and is ready to go back nothing is sent to the client making this an internal, as opposed to external, redirect.

        So without forcing a status of 200 CGI.pm redirect would send back a status of 302 (Moved Temporarily) which Apache would send on to the brower to deal with.

        I believe I am clear an this now, thanks for the clarification.

Re: •Re: cgi redirect (again)
by EvdB (Deacon) on Dec 03, 2002 at 15:43 UTC
    Correct me if I am wrong but internal redirects are only available when running under mod_perl in apache. Surely the code you posted will send out a redirect header to the browser if just running as a CGI. This would work but would change the URL displayed.

    One way to achieve a solution to the original question would be to have the CGI script request the page off the server and then pass it back to the browser verbatim, as if it were just a proxy.

    I may be wrong...

    Update: Typo (i before e except after c)