2

所以我只是在共享主机上安装了 cgit。我自定义编译它并使用符号链接 from $HOME/mydomain-and-public-www-folder.tld/gto$HOME/local/lib/cgit/prod链接$HOME/local/lib/cgit/${git describe}到我更新的构建中的构建以测试最新版本。这包括什么?

[sharedhost]$ pwd
$HOME/local/lib/cgit/prod
[sharedhost]$ ls
.htaccess  cgit.cgi  cgit.css  cgit.png lib/

https://mydomain.tld/g/现在,当我进入浏览器并看到漂亮的 cgit 界面时,登陆页面上看起来一切都很好。当我单击任何链接时,我得到了正确的存储库,但所有格式都消失了(CSS、PNG 和 JS 文件再见,所有链接都采用https://mydomain.tld/g/cgit.cgi/randomrepo.git所有 URL 的形式。当然所有文件在 prod 路径中不起作用,因为浏览器会寻找类似的东西https://mydomain.tld/g/cgit.cgi/cgit.css而不是需要的https://mydomain.tld/g/cgit.css. 现在,这是我的基本 .htaccess 文件以使其正常工作。

[sharedhost]$ more .htaccess 
# GIT BEGIN ###########################################################

Options +Indexes +FollowSymLinks +ExecCGI 

Action fastcgi-script cgit.cgi

SetEnv HTTP_CGIT_CONFIG /home/username/local/lib/cgit/cgit-conf/cgitrc

RewriteEngine On
DirectoryIndex cgit.cgi

# GIT END ############################################################

# AUTHENTICATION BEGIN ###############################################
AuthType Digest
AuthName "cgitdigestdomain"
AuthDigestDomain /cgitdigestdomain/
AuthUserFile  /home/username/local/lib/cgit/cgit-conf/.htpasswd
Require valid-user
# AUTHENTICATION END  ################################################

我已经尝试了一大堆推荐的重写模式,例如 [1] 或 [2]。我对更高级的 .htaccess 规则相对较新,所以有人可以指出如何cgit.cgi使用 mod-rewrite 从 URL中删除确保同一目录中的 css 和 png 文件可访问并且QSA/查询字符串得到正确处理。对不起,很长的帖子。我认为更多的细节会说明为什么明显的操作方法对我不起作用。

[1]使用 .htaccess 从 URL 中删除 'index.php'

[2] htaccess 从 url 中删除子目录

更新

两个答案似乎都不错,但我认为我不了解虚拟根和扫描路径功能,但似乎这些答案比以前更进一步,但关键部分仍然缺失。任何指向 repo 的 url(在一个很远的路径中$HOME/data/scm/priv)都没有正确重定向,我得到一个 404。

[Fri Jul 13 01:16:18 2012] [error] [client 127.0.0.1] File does not exist: $HOME/mydomain-and-public-www-folder.tld/missing.html, referer: https://domain.tld/g/
[Fri Jul 13 01:24:20 2012] [error] [client 127.0.0.1] File does not exist: $HOME/mydomain-and-public-www-folder.tld/failed_auth.html, referer: https://domain.tld/g/
[Fri Jul 13 01:24:21 2012] [error] [client 127.0.0.1] File does not exist: $HOME/mydomain-and-public-www-folder.tld/g/bicon.git, referer: https://domain.tld/g/
[Fri Jul 13 01:24:21 2012] [error] [client 127.0.0.1] File does not exist: $HOME/mydomain-and-public-www-folder.tld/missing.html, referer: https://domain.tld/g/
[Fri Jul 13 01:26:11 2012] [error] [client 127.0.0.1] File does not exist: $HOME/mydomain-and-public-www-folder.tld/g/admin-scripts.git, referer: https://domain.tld/g/
[Fri Jul 13 01:26:11 2012] [error] [client 127.0.0.1] File does not exist: $HOME/mydomain-and-public-www-folder.tld/missing.html, referer: https://domain.tld/g/

更改名称/IP 以保护无辜者,但您明白了。所以看起来回购请求不会回到cgit CGI,那么他们去哪里了?我正在努力获得更好的重定向日志。我们会看到的。

更新 2:

当然,RewriteLog这是一个你不能输入的指令,.htaccess因为我忘记了,愚蠢的我。不确定现在在共享主机上该怎么做。多么令人讨厌。这是促使我研究 VPS 托管并咬紧牙关并仅将这个共享主机用于非常愚蠢的东西的几个问题之一。

PS:我确实将原始问题按原样通过电子邮件发送到 cgit dev 列表,但也从未收到任何回复。所以他们不在乎,觉得这是一个愚蠢的问题,不确定。哈哈。

4

3 回答 3

4

通常,如果您的工具有帮助,这类问题会更​​容易解决。你也是。

根据此页面您可以设置virtual-root设置(在您的情况下为“/g”并使用以下规则:

RewriteRule ^/g/$ /g/cgit.cgi                            [L,QSA]
RewriteRule ^/g/([^/]+)/$ /g/cgit.cgi?r=$1               [L,QSA]
RewriteRule ^/g/([^/]+)/([^/]+)/$ /g/cgit.cgi?r=$1&p=$2  [L,QSA]

我将路径调整为我认为适合您的路径,但我不确定这里的递归性。它应该可以工作(因为 L),但如果没有,我建议您将文件夹 /g 重命名为 /git 之类的名称并在路径中使用它(例如 /git/cgit.cgi)

至于 css 和 js 文件,您将需要另一个规则,如下所示:

ReWriteCond /g/$1 -f
ReWriteRule ^/g/(.+)$ - [L]

如果文件存在,这应该使 url 保持不变。将此规则置于上述规则之前。


更新:

我希望添加virtual-root会将页面上的链接更改为所需的形式;我建议您仔细检查 cgit.cgi 是否已获取配置。

但是,如果您想解决这个问题,请尝试以下规则:

ReWriteCond /g/$1 -f
ReWriteRule ^/g/cgit.cgi/(.+)$ /g/$1 [L]
于 2012-07-12T17:17:45.840 回答
1

Fozi 的回答在我的情况下不太奏效。这些重写规则virtual-path=//etc/cgitrc.

<Directory /var/www/cgit>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule (.*) /cgit.cgi/$1
</Directory>

确保在与 cgit 混淆时使用restart您的 Web 服务器而不是reloading 它,因为它似乎缓存了一些东西。

于 2014-07-28T21:49:28.373 回答
0

这行得通吗?

# Redirect the browser to remove the "cgit.cgi" from the URL's address bar
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /g/cgit\.cgi/
RewriteRule ^g/cgit\.cgi/(.+)\.git /g/$1.git [R=301,L]

# Internally add the "cgit.cgi" so that it gets served properly
RewriteCond %{REQUEST_URI} !^/g/cgit.cgi/
RewriteRule ^g/(.+)\.git /g/cgit.cgi/$1.git [L]

您可能希望在RewriteEngine On. 第一条规则检查请求的 URI 是否包含/g/cgit.cgi/并以 a 结尾,如果是,则使用删除.git的重定向。cgit.cgi这将使其看到的相对链接将具有基础 of/g/而不是/g/cgit.cgi/. 然后,我们需要在内部将它们改回来,这就是第二条规则的用武之地。如果请求不包含cgit.cgi,则只要 URI 以 结尾,则在内部添加一个.git


编辑:我可能误解了“如何cgit.cgi使用 mod-rewrite 从 URL 中删除”的意思

看看这些规则是否适合你:

RewriteCond %{REQUEST_URI} ^/g/cgit\.cgi/(.+)$
RewriteCond %{DOCUMENT_ROOT}/g/%1 -f
RewriteRule ^g/cgit\.cgi/(.+)$ /g/$1 [L]

第一个条件检查请求 URI 是否以它开头/g/cgit.cgi/并对其后面的任何内容进行反向引用。然后它检查是否存在物理上的文件,如果该cgit.cgi部分被删除,如果是,则重写 URI 以将其删除。

这样,只要引用的资源实际上/g/位于./g/cgit.cgi/something.git/g/

于 2012-07-03T18:46:12.443 回答