Hello,

this (longer) post deals with DirectoryIndex expansion,
Apache::PerlRun (Registry gives the same) and CGI's url('-relative' => 1)
method. The versions are 1.24, 2.68, 1.3.11 and 5.6.0+patches upto the
end of May. In the end, there is a proposed patch for CGI.pm, but as I'm
not sure if the behaviour is a bug or feature of mod_perl, I'm sending it
to [EMAIL PROTECTED] as well, for comments.

This config

        <LocationMatch ^/testing/(index\.pl)?$>
        SetHandler perl-script
        PerlSetVar PerlRunOnce On
        PerlSendHeader On
        PerlHandler Apache::PerlRun
        </LocationMatch>

and request for https://server/testing/ leads to redirect, where the
interesting values (printed via %ENV) are

        PATH_INFO=/
        PATH_TRANSLATED=/www/
        REDIRECT_PATH_INFO=/
        REDIRECT_PATH_TRANSLATED=/www/
        REDIRECT_REQUEST_URI=/testing/
        REDIRECT_SCRIPT_FILENAME=/www/testing
        REDIRECT_SCRIPT_NAME=/testing
        REDIRECT_URL=/testing/
        REQUEST_URI=/testing/
        SCRIPT_FILENAME=/www/testing/index.pl
        SCRIPT_NAME=/testing/index.pl

This confuses CGI.pm, because $q->url('-relative' => 1) returns
'testing', not '' as would be expected.

If I change the config to be

        <LocationMatch ^/testing/index\.pl$>
        SetHandler perl-script
        PerlSetVar PerlRunOnce On
        PerlSendHeader On
        PerlHandler Apache::PerlRun
        </LocationMatch>

the redirect seems to be much less aggresive and the values are

        REDIRECT_URL=/testing/
        REQUEST_URI=/testing/
        SCRIPT_FILENAME=/www/testing/index.pl
        SCRIPT_NAME=/testing/index.pl

There is no PATH_INFO value here, as well. And the PATH_INFO being
set in the previous case is the cause of the trouble. I believe that
the following patch fixes the problem -- from '/testing/', even if
the path_info is '/', the relative address still needs to stay '',
not 'testing', otherwise '/testing/testing' is achieved in the link.

--- CGI.pm.orig Mon Jun  5 14:04:12 2000
+++ CGI.pm      Mon Jun  5 14:04:48 2000
@@ -2183,6 +2183,7 @@
         # and path
         if (exists($ENV{PATH_INFO})) {
            my $decoded_path = unescape($ENV{PATH_INFO});
+           $decoded_path =~ s!^/!!;
            substr($script_name,$index) = '' if ($index = 
rindex($script_name,$decoded_path)) >= 0;
          }
     } else {

Comments are gladly welcome.

-- 
------------------------------------------------------------------------
 Honza Pazdziora | [EMAIL PROTECTED] | http://www.fi.muni.cz/~adelton/
   .project: Perl, DBI, Oracle, MySQL, auth. WWW servers, MTB, Spain.
------------------------------------------------------------------------

Reply via email to