2010-03-02 61 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总是首选。