2010-03-02 108 views
6

我的網站是一個具有多個子庫的mercurial存儲庫。我需要確保我拒絕訪問服務器上每個.hg目錄中的所有文件。安全:拒絕通過mod_rewrite訪問.hg/*

例如,我有http://example.com/.hg/http://example.com/subrepo1/.hg/

我已經添加了以下爲.htaccess:

<Files ~ "^\.(hg|ht)"> 
    Order allow,deny 
    Deny from all 
</Files> 

這是一個良好的開端,因爲它拒絕訪問的文件與.hg.ht開始但它不會拒絕對.hg目錄中的文件的訪問,所以如果有人輸入,例如http://example.com/.hg/branch,則分支文件將顯示在瀏覽器中。

我需要做些什麼才能確保這些文件不會顯示給用戶?如果有人試圖訪問我的服務器上任何.hg目錄中的文件,我希望發送403或404回瀏覽器。

這個問題也適用於任何網站是Subversion/svn存儲庫的人。

回答

7

如果你不這樣做使用mod_rewrite,那麼你可以這樣做:

RedirectMatch 404 /\\.hg(/|$) 

(全面披露:答案適用於水銀從this question做同樣的事情顛覆)。

+0

當我嘗試使用Directory,DirectoryMatch,Location或LocationMatch時,出現500錯誤,所以我認爲它不允許在.htaccess中。然而,RedirectMatch的工作方式就像一個魅力。謝謝! – Tex 2010-03-02 08:27:21

+0

@Tex - 我會編輯它 - 看起來,從SVN問題的OP有麻煩讓'DirectoryMatch'也工作。 – 2010-03-02 08:31:41

+0

我的理解是,在.htaccess中不允許使用「Directory」,「DirectoryMatch」,「Location」和「LocationMatch」。 – Tex 2010-03-02 08:36:08

0

您始終可以將.htaccess文件放置在這些文件夾中,並拒絕文件夾中的所有訪問。

我假設你想要一個解決方案,你不必將.htaccess文件放在每個文件夾和子文件夾中?

請嘗試以下(假設你已經ssh訪問的網絡服務器):

  • 更改到你的網站的DocumentRoot
  • 創建.htaccess文件

內容:

Order deny, allow 
Deny from all 
  • 執行以下命令:

    find . -type d -name .hg -exec cp ./.htaccess {} \;

  • 然後從你的文檔根目錄中刪除.htaccess文件再次

+0

嗨,我也喜歡這個解決方案,但它有一個缺點--.hg目錄內的文件沒有版本控制,我敢肯定他們沒有包含在一個新的版本庫中。這意味着我必須再次執行此步驟,因爲如果我沒有弄錯,那麼.hg/.htaccess文件將不會自動包含在克隆中。 – Tex 2010-03-02 08:33:02

+0

是的,我認爲你是對的。在一個新的克隆它不會被包括在內。 – Aurril 2010-03-02 08:35:45

0

這是更關注的,如果你只是保持外的倉庫你DocumentRoot。您可能使用hgweb或hgwebdir,它們不需要將文件放在DocumentRoot中,所以不要這樣做。把它們放在/ home/hg/repos或者其他東西里,然後配置你的hgwebdir.conf到那裏。

在DocumentRoot內部使用Repos的唯一原因是爲mercurial啓用靜態http URL表單,但速度非常慢,並且hgweb總是首選。