Apache 从虚拟位置使用环境

Apache 从虚拟位置使用环境

我遇到了一点问题。

我希望能够使用诸如 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 文件的数量(或变得非常混乱)。

问题摘要

  1. 由于目录不存在,我是否需要重写规则?
  2. 如何将环境变量传递到另一个“位置”?
  3. 有没有办法简化 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-arepo-1您可以将其扩大,但要小心不要吞下太多,.*但这取决于 CGI 的工作方式。

相关内容