2012-07-03 97 views
2

所以我剛剛在共享主機上安裝了cgit。我自定義編譯它,並使用從$HOME/mydomain-and-public-www-folder.tld/g$HOME/local/lib/cgit/prod的符號鏈接將$HOME/local/lib/cgit/${git describe}鏈接到我的更新版本中構建以測試最新版本。這包括什麼?htaccess:從路徑中刪除cgit.cgi

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

現在,一切看起來不錯,良好的着陸頁上,當我把在https://mydomain.tld/g/在瀏覽器中,我看到漂亮的CGT文件接口。當我點擊任何鏈接時,我會得到正確的回購,但是所有的格式都不見了(CSS,PNG和JS文件都會通過,所有鏈接的形式都是https://mydomain.tld/g/cgit.cgi/randomrepo.git)。在督促路徑文件沒有工作,因爲瀏覽器的外觀對於像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規則比較陌生,所以有人可以指出如何從URL中刪除cgit.cgi,使用mod重寫確保css和png文件在同一個目錄ar中易於訪問正確處理QSA /查詢字符串。對不起,很長的職位。我認爲更多的細節會說明爲什麼這些明顯的方法不適合我。

[1] Remove 'index.php' from URL with .htaccess

[2] htaccess remove subdirectory from url

UPDATE

兩個答案似乎是不錯的,但我不認爲我瞭解虛擬根和掃描 - 路徑功能,但似乎這些答案比以前更遠,但關鍵部分仍然缺失。任何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託管並咬錢,並將這個共享主機用於非常愚蠢的東西。

附註:我沒有將原始問題通過電子郵件發送到cgit開發人員列表,也從未得到任何回覆。所以他們不在乎,並且覺得這是一個毫無疑問的問題,不確定。哈哈。

回答

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/,並以.git結尾,如果是,則將刪除的cgit.cgi重定向。這將使相關鏈接看到將有一個基地/g/而不是/g/cgit.cgi/。然後,我們需要改變他們回到國內,這是在第二個規則的用武之地。如果請求不包括cgit.cgi,然後在內部添加一個在只要URI與.git結束。


編輯:我可能誤解的「如何從與國防部重寫的URL cgit.cgi

看看這些規則爲你工作,你的意思:

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以便將其刪除。

這樣,從URL的喜歡/g/cgit.cgi/something.git鏈接到了你的CSS和坐在/g/ js目錄和圖片,但得到相對的請求將在內部,只要參照的資源實際上是/g/解決。

+0

沒有工作。我仍然有同樣的問題。另外,如果cgit配置正確,您可以從git repo中刪除文件擴展名('.git')。在理論上,我希望這樣,如果這一切都運行。儘管如此,你的沒有工作。不過,我很有希望。 – songei2f

+0

@alharaka可能誤解了您的問題,請在答案的編輯部分嘗試規則 –

+0

與其他答覆一樣,我遇到了問題。往上看。 – songei2f

4

通常這樣那樣的問題是,如果你有從你的工具,一些幫助來解決容易得多。你也是。

根據this page您可以將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] 

我調整的路徑是什麼,我認爲會是你的權利,但我m不知道這裏的遞歸,它應該工作(因爲L),但是如果它不工作,我建議你將文件夾/ g重命名爲/ git之類的東西,並在路徑中使用它(例如/git/cgit.cgi )

至於css和js文件,您將需要另一個規則,如下所示:

如果文件存在10
ReWriteCond /g/$1 -f 
ReWriteRule ^/g/(.+)$ - [L] 

這應該離開網址不變。將此規則放在上面的規則之前。


更新:

我希望加入virtual-root將改變頁面所需表格上的鏈接;我建議你仔細檢查cgit.cgi是否已經啓動了配置。

但是,如果你想解決的是,嘗試這條規則:

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

+1如果我對這個問題的閱讀是正確的,這個答案的第二部分是重要的一點... – Stobor

+0

是的,謝謝,試了你的,最後一部分,不管這兩個規則,都不會重定向到腳本來獲取回購,或者如此。往上看。 – songei2f

+0

所以如果我手動改變重寫規則'RewriteRule ^/g /([^ /] +)/([^ /] +)/ $ /g/cgit.cgi?r=$1&p=$2 [L,QSA] '手動,我當然會得到理想的結果。我無法弄清楚爲什麼這些請求URL不會被重寫並傳回,但似乎您有這個想法。 – songei2f

0

Fozi的回答並沒有在我的情況相當的工作。這些重寫規則適用virtual-path=//etc/cgitrc

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

確保restart代替reload與CGT文件搞亂當荷蘭國際集團就您的Web服務器,因爲它似乎緩存一些東西。