在 scriptalias 中未看到 SetEnv 指令的更改

在 scriptalias 中未看到 SetEnv 指令的更改

我需要在 ScriptAlias 脚本中读取环境变量。因此,我SetEnv在以下 apache 配置中设置了这些变量的指令。

<VirtualHost *:80>
ServerName ...
DocumentRoot /srv/www
ServerAlias git
DocumentRoot /srv/www/git-web
<Location />
   # Crowd auth 
   AuthType Basic
   AuthName "Git repositories"
   AuthBasicProvider crowd
   CrowdAppName ...
   CrowdAppPassword ...
   CrowdURL http://localhost:8080/crowd/
   CrowdGroupsEnvName REMOTE_USER_GROUPS
   Require valid-user
</Location>

SuexecUserGroup git git
SetEnv GIT_PROJECT_ROOT /home/dev_tools/git
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv GITOLITE_HTTP_HOME /home/dev_tools/git
SetEnv REMOTE_USER $REDIRECT_REMOTE_USER

ScriptAliasMatch "(?x)^/(.*/(HEAD | info/refs | objects/(info/[^/]+ | [0-9a-f]{2}/[0-9a-f]{38} | pack/pack-[0-9a-f]{40}\.(pack|idx)) | git-(upload|receive)-pack))$" /srv/www/gitolite_suexec_wrapper.sh/$1

<Directory /srv/www>
  <Files gitolite_suexec_wrapper.sh>
    Order allow,deny
    Allow from all
  </Files>
</Directory>

<Directory "/srv/www/git-web">
    Options ExecCGI
    AllowOverride None
    AddHandler cgi-script .cgi
    DirectoryIndex gitweb.cgi
    Order allow,deny
    Allow from all
</Directory>
</VirtualHost>

在脚本中我看到此文件中声明的环境变量,但是如果我更改它(添加或删除SetEnv指令、更改其中一个值或添加UnsetEnv指令),则 shell 脚本不会看到其环境变量发生变化

当我更改配置时,restartapache2 确实会重新解析我更改的文件(如果我在此文件中写入无法解析的内容,apache2 会告诉我它无法启动)。

要查看 /srv/www/gitolite_suexec_wrapper.sh 中的环境,我使用:

#!/bin/bash
printenv >> log_file

SetEnvfor指令中给出了以下警告:

此指令设置的内部环境变量是在大多数早期请求处理指令运行后设置的,例如访问控制和 URI 到文件名映射。如果您要设置的环境变量是作为此早期处理阶段的输入(例如 RewriteRule 指令),则应使用 SetEnvIf 设置环境变量。

但是我认为我并不担心这个警告,因为我的脚本看到了一些环境变量并且多个教程使用SetEnv/在 http 服务器上设置 git。ScriptAliasMatch

有人知道为什么即使我更改了 apache2 配置,我的日志文件也总是充满相同的环境吗?

服务器版本:Apache/2.2.15 (Linux/SUSE) 服务器建立时间:2011-11-29 15:51:01.000000000 +0000

答案1

我成功地通过 suexec 转发了用户变量,HTTP_方法是在用户变量前面加上 suexec 授权环境变量的硬编码列表中的前缀。

我很惊讶这是一种如此隐蔽的行为,我甚至无法在谷歌上再次找到我的资料来源。

另外,我仍然不明白为什么我为其他环境变量设置的第一个值仍然可见但无法更改。

但无论如何,我的问题解决了。

相关内容