Rewrote the (at least with Apache 2.2's environment) no more working
authorAxel Beckert <xtaran@users.sourceforge.net>
Wed, 30 Jul 2008 22:21:47 +0000 (22:21 +0000)
committerAxel Beckert <xtaran@users.sourceforge.net>
Wed, 30 Jul 2008 22:21:47 +0000 (22:21 +0000)
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

index 1d97bc5..4b867d0 100755 (executable)
@@ -2,7 +2,7 @@
 
 # Blosxom
 # Author: Rael Dornfest (2002-2003), The Blosxom Development Team (2005-2008)
 
 # 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
 
 # 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;
 
 );
 @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!/$!!;
 
 
 $url =~ s!/$!!;