Svn 如何在Apache中隐藏目录,特别是源代码管理?
我想让我的网站保持版本控制(特别是Subversion),并在有稳定版本需要更新时使用Svn 如何在Apache中隐藏目录,特别是源代码管理?,svn,apache,Svn,Apache,我想让我的网站保持版本控制(特别是Subversion),并在有稳定版本需要更新时使用svn co进行更新,但我担心这样做的安全性,因为所有.svn文件夹都是公共的,其中包括各种私有数据,其中最重要的是完整的源代码到我的网站 我能做些什么来防止这种情况发生吗?这可以在服务器范围内(推荐)、在单个虚拟主机上实现,甚至可以在.htaccess文件中实现,如果您的服务器对文件中允许的内容有一定的许可。您需要的具体配置是: RewriteEngine On RewriteRule /\.svn /som
svn co
进行更新,但我担心这样做的安全性,因为所有.svn
文件夹都是公共的,其中包括各种私有数据,其中最重要的是完整的源代码到我的网站
我能做些什么来防止这种情况发生吗?这可以在服务器范围内(推荐)、在单个虚拟主机上实现,甚至可以在
.htaccess
文件中实现,如果您的服务器对文件中允许的内容有一定的许可。您需要的具体配置是:
RewriteEngine On
RewriteRule /\.svn /some-non-existant-404-causing-page
<IfModule autoindex_module>
IndexIgnore .svn
</IfModule>
重新编写引擎打开
重写规则/\.svn/some-non-existant-404-causing-page
IndexIgnore.svn
第一部分需要mod_rewrite
。它强制将其中包含“/.svn”的任何请求(即对目录的任何请求或目录中的任何内容)在内部重定向到网站上不存在的页面。这对最终用户来说是完全透明的,并且是不可检测的。它还强制执行404错误,就好像您的.svn
文件夹刚刚消失一样
第二部分纯粹是装饰性的,如果自动索引模块被激活,它将从中隐藏.svn
文件夹。这也是一个好主意,只是为了防止好奇的灵魂得到任何想法。两件事:
<DirectoryMatch \.svn>
Order allow,deny
Deny from all
</DirectoryMatch>
如果您没有访问主配置文件的权限,您只能希望mod_rewrite能够在.htaccess中使用。按照Vinko的说法隐藏目录应该可以。但是它可能比svn co更容易使用。这不应该生成.svn目录 我使用了一种有趣的方法:签出(和更新)在一个完全独立的目录(可能在一台完全独立的机器上)上完成,然后将代码复制到Web服务器使用rsync读取代码的地方。rsync命令行上的--exclude规则用于使其不复制任何.svn(和CVS)目录,而--delete excluded则确保即使以前复制过它们,也会将它们删除 由于svn update和rsync都进行增量传输,因此即使对于较大的站点,这种传输速度也相当快。它还允许您将存储库置于防火墙后面。唯一需要注意的是,必须将服务器上生成文件的所有目录(如Drupal上的文件/目录)移动到rsync目标目录之外的位置(以这种方式使用时,rsync将覆盖所有内容),并且必须在rsync源目录中创建指向它的符号链接。rsync源目录也可以有其他非版本文件(如特定于机器的配置文件) 我使用的整套rsync参数是
rsync -vv --rsh='ssh -l username' -rltzpy --exclude .svn/ --exclude CVS/ --exclude Attic/ --delete-after --delete-excluded --chmod=og-w,Fa-x
即使如此,为了冗余,我仍然有一个配置规则来防止访问.svn,它是从Debian默认规则复制的,该默认规则防止访问.ht*(.htaccess.htpasswd)。考虑使用操作系统的包管理工具部署实时代码,而不是直接从VCS部署。这将使您能够确保live软件包不包含元数据目录或其他可能敏感的工具和数据。在相同的情况下,我使用了
RedirectMatch
,原因有二。基本上,这是我能找到的唯一一种在该服务器上的.htaccess
中允许的方法,该服务器的配置非常严格,我无法修改。此外,我认为它最干净,因为它允许我告诉Apache,是的,那里有一个文件,但只是假装它不是在服务时,所以返回404(而不是403,这会暴露网站观众不应该知道的东西)。
我现在把下面的代码看作是我的代码> .HTAccess 文件的标准部分:
## Completely hide some files and directories. RedirectMatch 404 "(?:.*)/(?:[.#].*)$" RedirectMatch 404 "(?:.*)~$" RedirectMatch 404 "(?:.*)/(?:CVS|RCS|_darcs)(?:/.*)?$" ##完全隐藏一些文件和目录。 重定向匹配404“(?:.*)/(?:[.#].*)” 重定向匹配404“(?:.*)~$” 重定向匹配404“(?:*)/(?:CVS | RCS | | | darcs)(?:/*)”我使用以下命令,向用户返回一个简单的404,但不显示源代码管理目录实际上存在:
重定向匹配404/\(svn | git)(/|$)我理解403的要点。就我个人而言(在这种情况下,永远不应该提供文件),我更希望他们不知道目录的存在。我也要试试这个别名匹配。这就是我从谷歌那里收集到的,我总是很高兴能找到更好的解决方案。请注意,如果您试图在共享/虚拟主机上执行此操作,则在.htaccess文件中不起作用。如果您没有访问httpd.conf文件的权限,请使用您的答案。对。mod_rewrite也可能无法在.htaccess文件中使用。(如中所示,如果您的服务器对其中允许的内容有一定的权限),您也可以将此解决方案与RedirectMatch一起使用,这将产生大致相同的结果,并且可用于.htaccess文件。这是一个更复杂的解决方案,但是如果你没有MODYRead Access,它也可以工作。你可能需要从最近的Apache版本简单的“允许,拒绝”中取出空白,但是你不能得到增量更新的好处。如果我修改了一个图像和两个脚本,我真的需要放下MB(并在执行操作时使站点处于维护模式)而不是几秒钟进行签出吗?请参阅( ## Completely hide some files and directories. RedirectMatch 404 "(?:.*)/(?:[.#].*)$" RedirectMatch 404 "(?:.*)~$" RedirectMatch 404 "(?:.*)/(?:CVS|RCS|_darcs)(?:/.*)?$"