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

Re: Static gitweb content when using pathinfo

From
Jakub Narebski <jnareb@gmail.com>
Date
Apr 17, 2012, 12:30 UTC
Message-ID
<201204171430.52650.jnareb@gmail.com>
In-Reply-To
<4F8C384C.2040109@gmail.com>
On Mon, 16 Apr 2012, José María Escartín Esteban wrote:
> On 14/04/12 19:19, Jakub Narebski wrote:
>> On Thu, 5 Apr 2012, Jakub Narebski wrote:
>>> On Thu, 5 Apr 2012, José María Escartín Esteban wrote:
Show 14 quoted lines
>>> There might be problem if you configured your web server to serve gitweb
>>> using it as a handler for subdirectory, so the script name does not need
>>> to appear in URL, e.g.
>>>
>>>   http://localhost/cgi-bin/gitweb
>>>
>>> which would require the following base element
>>>
>>>   <base href="http://localhost/cgi-bin/gitweb/" />
>>
>> [...]
>>
> 
> Yes, that was precisely the problem.

Note that you won't have problem with `http://localhost` as base url (without any directory), or in more realistic case using virtual host rather than virtual directory. The problem is that without '/' the path part of $base_url is stripped of last element.

Just for completeness.
[...]
> This addition to the man page would of course have been useful, since it took me
> a while to detect that the problem was a missing slash in the base url.
> However, it would not have solved completely my problem, and for me the best has
> been to add the line of code you proposed in the previous email.
So how about the proposed updated addition at the end of this email?
Show 23 quoted lines
> I am running a Debian testing (wheezy) server, so the distro gitweb files are:
> 
> 	/etc/apache2/conf.d/gitweb
> 	/etc/gitweb.conf
> 	/usr/share/gitweb/gitweb.cgi
> 	/usr/share/gitweb/index.cgi -> /usr/share/gitweb/gitweb.cgi
> 	/usr/share/gitweb/static/*
> 
> I am using two sets of git repositories, and each of the sets works through a
> particular gitolite user:
> 
> 	user     home
> 	----------------------
> 	git      /srv/project
> 	mygit    /srv/mygit
> 
> I wanted that different groups of people were able to browse the 'project' repos
> (in fact it is a mirror from the main project server) from
> 	http://server.example.com/project/ ,
> and the 'mygit' repos from
> 	http://server.example.com/mygit/ .
> And I wanted to keep urls as short and easy as possible, and to avoid
> proliferation of configs as much as possible.
I think that is this "two sets" that created configuration with a problem.
 
Show 11 quoted lines
> The setup I came up with was to link
> 
> 	/srv/www/project -> /usr/share/gitweb
> 	/srv/www/mygit -> /usr/share/gitweb
> 
> and to use the following configuration files:
> 
> ######### /etc/apache2/conf.d/gitweb ##################
> <Directory /srv/www/project>
>         SetEnv  GITWEB_PROJECTROOT      /srv/git/
>         SetEnv  GITWEB_CONFIG           /etc/gitweb.conf
[...]
Show 11 quoted lines
> #######################################################
> 
> ######### /etc/gitweb.conf ############################
> $projectroot = $ENV{'GITWEB_PROJECTROOT'}."repositories";
> $git_temp = "/tmp";
> $projects_list = $ENV{'GITWEB_PROJECTROOT'}."projects.list";
> @diff_opts = ();
> $feature{'pathinfo'}{'default'} = [1];
> $feature{'highlight'}{'default'} = [1];
> $projects_list_description_width = 50;
> #######################################################
A question: why not have
          SetEnv  GITWEB_PROJECTROOT      /srv/git
and use
  $projectroot = "$ENV{'GITWEB_PROJECTROOT'}/repositories";
  $projects_list = "$ENV{'GITWEB_PROJECTROOT'}/projects.list";
 

BTW. what is this $git_temp? Is it modified gitweb, because core one doesn't need to use temporary directory for anything nowadays?

A tip: you can use GITWEB_CONFIG_COMMON for the common part of configuration and separate GITWEB_CONFIG for per-instance configuration. Though I am not sure if it would help in your case. It requires modern gitweb. though.

Show 6 quoted lines
> Probably there are better ways to implement this, but at least this seems to
> work, once I have added
> 
> 	$base_url .= '/' unless ($base_url =~ m!/$!);
> 
> to /etc/gitweb.conf .
-- >8 ---------- >8 --
Subject: [PATCH] gitweb.conf(5): When to set $base_url

Add a paragraph to description of $base_url variable in gitweb.conf(5) manpage explaining when and why one might need to set it, and how.

Based-on-report-by: José María Escartín Esteban <ripero84@gmail.com>
Signed-off-by: Jakub Narębski <jnareb@gmail.com>
---
 Documentation/gitweb.conf.txt |   24 ++++++++++++++++++++++++
 Documentation/gitweb.txt      |    4 ++++
 2 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.txt
index 7aba497..4716a0f 100644
--- a/Documentation/gitweb.conf.txt
+++ b/Documentation/gitweb.conf.txt
@@ -559,6 +559,30 @@ $base_url::
 	PATH_INFO.  Usually gitweb sets its value correctly,
 	and there is no need to set this variable, e.g. to $my_uri or "/".
 	See `$per_request_config` if you need to override it anyway.
++
+You would need to set this variable when using path_info-based URLs
+while using gitweb as a directory handler (which means that full path
+to browse repositories looks like `http://git.example.com/gitweb`
+rather than looking like `http://git.example.com/gitweb/gitweb.cgi`).
+You can find yourself in this situation (gitweb as directory handler)
+when configuring gitweb to use FastCGI interface as shown in
+"Webserver configuration" section on linkgit:gitweb[1] manpage.
++
+If static files are served from 'static' subdirectory of directory
+the gitweb script is handler for, with default URLs of static files
+(e.g. `$logo` is `static/git-logo.png`), then you would need to ensure
+that `$base_url` ends with slash to denote that it is directory, to
+work correctly:
++
+----------------------------------------------------------------------
+$base_url .= '/' unless ($base_url =~ m!/$!);
+----------------------------------------------------------------------
++
+For example if gitweb URL is `http://git.example.com/gitweb`, and
+static files are available in `http://git.example.com/gitweb/static/`
+then `$base_url` must end up to be `http://git.example.com/gitweb/`
+(with trailing slash) for e.g. `static/git-logo.png` relative link
+to refer to `http://git.example.com/gitweb/static/git-logo.png`.
 
 
 CONFIGURING GITWEB FEATURES
diff --git a/Documentation/gitweb.txt b/Documentation/gitweb.txt
index b394ecc..c3db66a 100644
--- a/Documentation/gitweb.txt
+++ b/Documentation/gitweb.txt
@@ -473,6 +473,10 @@ With that configuration the full path to browse repositories would be:
 
   http://server/gitweb
 
+Note that for this configuration `$base_url` must be set as described
+in linkgit:gitweb.conf[5] for gitweb to correctly serve static files
+with path_info links.
+
 As PSGI using plackup
 ~~~~~~~~~~~~~~~~~~~~~
 Gitweb can run as PSGI app (via emulation with *CGI::Emulate::PSGI*(3pm)).
-- 
1.7.9
Previous: José María Escartín EstebanNext: José María Escartín Esteban
Message 5 of 6 in “Static gitweb content when using pathinfo”
  1. José María Escartín EstebanApr 5, 2012
  2. Jakub NarebskiApr 5, 2012
  3. Jakub NarebskiApr 14, 2012
  4. José María Escartín EstebanApr 16, 2012
  5. Jakub NarebskiApr 17, 2012
  6. José María Escartín EstebanApr 24, 2012

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.