Search code examples
apache.htaccesscgit

setting CGIT_CONFIG environment variable in .htaccess


I want to set the path of cgit config (CGIT_CONFIG) in a directory with SetEnv.

But it seems that cgit can't find this env variable. My .htaccess is as follow:

Options +ExecCGI +Indexes +FollowSymLinks
#DirectoryIndex cgit.cgi     I named cgit as index.cgi
SetEnv "CGIT_CONFIG" "/home/user_253/etc/cgitrc"
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.cgi/$1 [END,QSA]
RewriteCond %{QUERY_STRING} service=git-receive-pack
RewriteRule .* - [END,F]

Of course, I haven't access to main Apache config file...


Solution

  • Try using SetEnvIf (part of mod_setenvif) instead to set the environment variable.

    For example:

    SetEnvIf ^ ^ CGIT_CONFIG /home/user_253/etc/cgitrc
    

    The SetEnvIf directive takes additional arguments, hence the need for two "simple" regex to effectively set the env var unconditionally.

    The "problem" with SetEnv (mod_env) is that it is processed very late. The request will have already been rewritten to /index.cgi (by mod_rewrite) before the SetEnv directive is processed. Whereas SetEnvIf is processed before mod_rewrite handles the request. (Directives in Apache config files are not necessarily processed top to bottom. Different modules are processed independently.)


    Aside:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule (.*) /index.cgi/$1 [END,QSA]
    
    RewriteCond %{QUERY_STRING} service=git-receive-pack
    RewriteRule .* - [END,F]
    

    These two rules are possibly the wrong way round. Any URL that does not map to a file but includes the query string service=git-receive-pack will not be blocked.