我遇到了一点问题。
我希望能够使用诸如 git.my-domain.org/repo-a 之类的位置来设置在 git.my-domain.org/ 中使用的环境,因为 /repo-a 使用重写规则更改为 /(我必须使用?)
<VirtualHost *:80>
ServerName git.my-domain.org
DocumentRoot /usr/share/gitweb
RewriteEngine On
<Location /repo-a>
RewriteRule /repo-a(.*) /$1 [PT]
SetEnv GITWEB_CONFIG "/var/lib/gitolite/repositories/repo-a.git/gitweb/gitweb_config.perl"
</Location>
<Directory />
AllowOverride All
Options +FollowSymLinks +ExecCGI
Order allow,deny
Allow from all
DirectoryIndex gitweb.cgi
AddHandler cgi-script .cgi
</Directory>
</VirtualHost>
我需要使用重写规则,因为 /usr/share/gitweb/repo-a 不存在(或者存在?),而且我无意在那里创建任何目录。我想要的是使用 /daily-backups 中的 SetEnv GITWEB_CONFIG 并在 / 下使用它。但似乎没有设置,我也尝试过使用 SetEnvIf,但没有成功。
SetEnvIf Request_URI ".*repo-a" GITWEB_CONFIG "/var/lib/gitolite/repositories/repo-a.git/gitweb/gitweb_config.perl"
是否有一种自动化的方法可以将 RewriteRule 与 SetEnv 一起使用,这样我就不必为另一个存储库创建新的 RewriteRule 了?例如:
SetEnvIf Request_URI ".*repo-a" GITWEB_CONFIG "/var/.../$1.git/gitweb/gitweb_config.perl"
我知道我可以符号链接目录并使用 /var/lib/.../repo-a.git/gitweb/ 作为 DocumentRoot,但我宁愿避免这样做,因为它会增加 .conf 文件的数量(或变得非常混乱)。
问题摘要
- 由于目录不存在,我是否需要重写规则?
- 如何将环境变量传递到另一个“位置”?
- 有没有办法简化 SetEnvIf 或 SetEnv 以使用 URI?
答案1
你应该能够做到:
<VirtualHost *:80>
ServerName git.my-domain.org
DocumentRoot /usr/share/gitweb
RewriteEngine On
RewriteRule /(repo-?) / [E=GITWEB_CONFIG:/var/lib/gitolite/repositories/$1.git/gitweb/gitweb_config.perl,PT]
<Directory />
AllowOverride All
Options +FollowSymLinks +ExecCGI
Order allow,deny
Allow from all
DirectoryIndex gitweb.cgi
AddHandler cgi-script .cgi
</Directory>
</VirtualHost>
该正则表达式仅支持等repo-a
。repo-1
您可以将其扩大,但要小心不要吞下太多,.*
但这取决于 CGI 的工作方式。