From 735e1c54f5cd67deead58a84c41e9c2348131b53 Mon Sep 17 00:00:00 2001 From: Axel Beckert Date: Wed, 30 Jul 2008 22:21:47 +0000 Subject: [PATCH] Rewrote the (at least with Apache 2.2's environment) no more working manual base URL detection code. Made it simpler, easier to understand and overview. Added a lot of comments explaining the fixed problem and the remaining seldom cases where manual configuration is necessary. Modify $url only if the base URL was not set manually. The concept since 2.0.2 was: Always ask for the whole URI and then remove the PATH_INFO in some cases again. This caused some havoc. New concept is: Strip PATH_INFO from base URL if CGI.pm didn't manage to do it. In those rare cases where neither CGI.pm nor Blosxom manages to correctly determine the base URL, you can easily set $url in the config file to the correct value and no base URL magic happens anymore (except the removing of a trailing slash if present -- as before). There is one case where this code does more than necessary, too: If the URL requested is e.g. http://example.org/blog/blog and the base URL is correctly determined as http://example.org/blog by CGI.pm, then this code will incorrectly normalize the base URL down to http://example.org, because the same string as PATH_INFO is part of the base URL, too. But this is such a seldom case and can be fixed by setting $url in the config file, too. --- blosxom.cgi | 49 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/blosxom.cgi b/blosxom.cgi index 1d97bc5..4b867d0 100755 --- a/blosxom.cgi +++ b/blosxom.cgi @@ -2,7 +2,7 @@ # Blosxom # Author: Rael Dornfest (2002-2003), The Blosxom Development Team (2005-2008) -# Version: 2.1.0+dev ($Id: blosxom.cgi,v 1.81 2008/07/30 17:52:26 xtaran Exp $) +# Version: 2.1.0+dev ($Id: blosxom.cgi,v 1.82 2008/07/30 22:21:47 xtaran Exp $) # Home/Docs/Licensing: http://blosxom.sourceforge.net/ # Development/Downloads: http://sourceforge.net/projects/blosxom @@ -142,20 +142,39 @@ my $fh = new FileHandle; ); @num2month = sort { $month2num{$a} <=> $month2num{$b} } keys %month2num; -# Use the stated preferred URL or figure it out automatically -$url ||= url( -path_info => 1 ); -# Unescape %XX hex codes (from URI::Escape::uri_unescape) -$url =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; -$url =~ s/^included:/http:/ if $ENV{SERVER_PROTOCOL} eq 'INCLUDED'; - -# NOTE: Since v3.12, it looks as if CGI.pm misbehaves for SSIs and -# always appends path_info to the url. To fix this, we always -# request an url with path_info, and always remove it from the end of the -# string. -my $pi_len = length $ENV{PATH_INFO}; -my $might_be_pi = substr( $url, -$pi_len ); -substr( $url, -length $ENV{PATH_INFO} ) = '' - if $might_be_pi eq $ENV{PATH_INFO}; +# Use the stated preferred URL or figure it out automatically. Set +# $url manually in the config section above if CGI.pm doesn't guess +# the base URL correctly, e.g. when called from a Server Side Includes +# document or so. +unless ($url) { + $url = url(); + + # Unescape %XX hex codes (from URI::Escape::uri_unescape) + $url =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; + + # Support being called from inside a SSI document + $url =~ s/^included:/http:/ if $ENV{SERVER_PROTOCOL} eq 'INCLUDED'; + + # Remove PATH_INFO if it is set but not removed by CGI.pm. This + # seems to happen when used with Apache's Alias directive or if + # called from inside a Server Side Include document. If that + # doesn't help either, set $url manually in the configuration. + $url =~ s/\Q$ENV{PATH_INFO}\E$// if defined $ENV{PATH_INFO}; + + # NOTE: + # + # There is one case where this code does more than necessary, too: + # If the URL requested is e.g. http://example.org/blog/blog and + # the base URL is correctly determined as http://example.org/blog + # by CGI.pm, then this code will incorrectly normalize the base + # URL down to http://example.org, because the same string as + # PATH_INFO is part of the base URL, too. But this is such a + # seldom case and can be fixed by setting $url in the config file, + # too. +} + +# The only modification done to a manually set base URL is to strip +# a trailing slash if present. $url =~ s!/$!!; -- 2.30.2