git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] gitweb: fix wrong base URL when non-root DirectoryIndex

From
Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Date
Feb 12, 2009, 21:11 UTC
Message-ID
<1234473072-9901-1-git-send-email-giuseppe.bilotta@gmail.com>
From: Giuseppe Bilotta <oblomov@rbot.ratry.ru>

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.
---
 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.4
Next: Jakub Narebski
Message 1 of 13 in “gitweb: fix wrong base URL when non-root DirectoryIndex”
  1. gitweb: fix wrong base URL when non-root DirectoryIndexGiuseppe Bilotta, Feb 12, 2009
  2. Jakub NarebskiFeb 12, 2009
  3. Giuseppe BilottaFeb 13, 2009
  4. gitweb: fix wrong base URL when non-root DirectoryIndexGiuseppe Bilotta, Feb 13, 2009
  5. Jakub NarebskiFeb 13, 2009
  6. Junio C HamanoFeb 14, 2009
  7. Jakub NarebskiFeb 14, 2009
  8. Giuseppe BilottaFeb 14, 2009
  9. Junio C HamanoFeb 14, 2009
  10. gitweb: fix wrong base URL when non-root DirectoryIndexJakub Narebski, Feb 14, 2009
  11. Giuseppe BilottaFeb 14, 2009
  12. [PATCHv4] gitweb: fix wrong base URL when non-root DirectoryIndexGiuseppe Bilotta, Feb 15, 2009
  13. Junio C HamanoFeb 15, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.