To fix this behavior, add the following (highlighted) code in the InitRequest function:
sub InitRequest {
my @ScriptPath = split('/', "$ENV{SCRIPT_NAME}");
$CGI::POST_MAX = $MaxPost;
if ($UseUpload) {
$CGI::DISABLE_UPLOADS = 0; # allow uploads
} else {
$CGI::DISABLE_UPLOADS = 1; # no uploads
}
# Modify query string and script path for slashed links
if ($SlashLinks && (length($ENV{'PATH_INFO'}) > 1)) {
$ENV{'QUERY_STRING'} .= '&' if ($ENV{'QUERY_STRING'});
$ENV{'QUERY_STRING'} .= substr($ENV{'PATH_INFO'}, 1);
}
$q = new CGI;
# Fix some issues with editing UTF8 pages (if charset specified)
if ($HttpCharset ne '') {
$q->charset($HttpCharset);
}
$Now = time; # Reset in case script is persistent
$ScriptName = pop(@ScriptPath); # Name used in links
# Fix script name for relative links when slashed page links are used
if ($SlashLinks) {
my $numberOfSlashes = ($ENV{PATH_INFO} =~ tr[/][/]);
$ScriptName = ('../' x $numberOfSlashes) . $ScriptName;
}
$IndexInit = 0; # Must be reset for each request
...
While I agree that modifying environment variables is a bit hacky, at least it provides for a concise fix. :-) --MichaelBuschbeck
This patch works great under mod_cgi, but appears to fail under mod_perl. For some reason it just ignores slashed links as if the parameters weren't passed. After noticing that the query string still worked I thought to be more explicit when instantiating the CGI object in sub InitRequest and it actually worked:
Replaced:
$q = new CGI;
With:
if ($ENV{'REQUEST_METHOD'} eq 'GET') {
$q = new CGI($ENV{'QUERY_STRING'});
}
elsif($ENV{'REQUEST_METHOD'} eq 'POST') {
read (STDIN, $q, $ENV{'CONTENT_LENGTH'});
$q = new CGI($q);
}
This eliminates the need for the second part of your patch to "Fix script name for relative links". Thanks for your work on this--JAPH