On Fri, 13 Feb 2009, Giuseppe Bilotta wrote: > CGI::url() has some issues when rebuilding the script URL if the script > is a DirectoryIndex. > > One of these issue is the inability to strip PATH_INFO, which is why we > had to do it ourselves. > > Another issue is that the resulting URL cannot be used for the <base> > tag: it works if we're the DirectoryIndex at the root level, but not > otherwise. > > We fix this by building the proper base URL ourselves, and improve the > documentation about the need to strip PATH_INFO manually while we're at > it. > > Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@xxxxxxxxx> Sounds good. I don't use gitweb as DirectoryIndex myself, but Acked-by: Jakub Narebski <jnareb@xxxxxxxxx> > --- > gitweb/gitweb.perl | 16 ++++++++++++---- > 1 files changed, 12 insertions(+), 4 deletions(-) > > diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl > index c2c8080..48cfd5f 100755 > --- a/gitweb/gitweb.perl > +++ b/gitweb/gitweb.perl > @@ -27,15 +27,23 @@ our $version = "++GIT_VERSION++"; > our $my_url = $cgi->url(); > our $my_uri = $cgi->url(-absolute => 1); > > -# if we're called with PATH_INFO, we have to strip that > -# from the URL to find our real URL > -# we make $path_info global because it's also used later on > +# When the script is used as DirectoryIndex, the URL does not contain the name > +# of the script file itself, and $cgi->url() fails to strip PATH_INFO, so we > +# have to do it ourselves. We make $path_info global because it's also used > +# later on > our $path_info = $ENV{"PATH_INFO"}; > if ($path_info) { > $my_url =~ s,\Q$path_info\E$,,; > $my_uri =~ s,\Q$path_info\E$,,; > } > > +# Another issue with the script being the DirectoryIndex is that the resulting > +# $my_url data is not the full script URL: this is good, because we want > +# generated links to keep implying the script name if it wasn't explicitly > +# indicated in the URL we're handling, but it means that $my_url cannot be used > +# as base URL. Therefore, we have to build the base URL ourselves: > +our $base_url = $cgi->url(-base => 1) . $ENV{'SCRIPT_NAME'}; > + > # core git executable to use > # this can just be "git" if your webserver has a sensible PATH > our $GIT = "++GIT_BINDIR++/git"; > @@ -2908,7 +2916,7 @@ EOF > # the stylesheet, favicon etc urls won't work correctly with path_info > # unless we set the appropriate base URL > if ($ENV{'PATH_INFO'}) { > - print "<base href=\"".esc_url($my_url)."\" />\n"; > + print "<base href=\"".esc_url($base_url)."\" />\n"; > } > # print out each stylesheet that exist, providing backwards capability > # for those people who defined $stylesheet in a config file > -- > 1.5.6.5 > > -- Jakub Narebski Poland -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html