![在 scriptalias 中未看到 SetEnv 指令的更改](https://linux22.com/image/597204/%E5%9C%A8%20scriptalias%20%E4%B8%AD%E6%9C%AA%E7%9C%8B%E5%88%B0%20SetEnv%20%E6%8C%87%E4%BB%A4%E7%9A%84%E6%9B%B4%E6%94%B9.png)
我需要在 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 脚本不会看到其环境变量发生变化。
当我更改配置时,restart
apache2 确实会重新解析我更改的文件(如果我在此文件中写入无法解析的内容,apache2 会告诉我它无法启动)。
要查看 /srv/www/gitolite_suexec_wrapper.sh 中的环境,我使用:
#!/bin/bash
printenv >> log_file
SetEnv
for指令中给出了以下警告:
此指令设置的内部环境变量是在大多数早期请求处理指令运行后设置的,例如访问控制和 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 授权环境变量的硬编码列表中的前缀。
我很惊讶这是一种如此隐蔽的行为,我甚至无法在谷歌上再次找到我的资料来源。
另外,我仍然不明白为什么我为其他环境变量设置的第一个值仍然可见但无法更改。
但无论如何,我的问题解决了。