我们是一家网络开发组织,最近开始使用 Subversion 作为版本控制系统。由于执行更新比导出和复制文件快得多,开发人员希望能够让生产服务器成为工作副本。
我唯一担心的是系统中散落着的所有 .svn 文件,以及一些企业个人可能会读取其中文件的内容,可能向他们提供我们不希望他们知道的信息。
阻止 IIS 提供这些 .svn 目录内的任何内容的最好/最简单的方法是什么?
答案1
“不要那样做”并不能回答这个问题。
实际上,我喜欢在生产服务器上拥有一个工作副本,因为这样我可以在生产中快速做出更改(谁从来没有这样做过?)并重新检查它们。这取决于您希望将安全/便利滑块放在哪里,在许多情况下,这是一个好地方。
Apacheland 的标准解决方案是将 .svn 文件保留在那里,但告诉 Web 服务器永远不要提供这些文件。以下是使用 Windows 2000-2008 上的 IIS 5-7 执行此操作的方法。
下载并安装ISAPI_重写-- 精简版就足以满足此目的。请注意额外的系统要求适用于 Win 2008。 警告-- MSI 安装程序停止并启动 IIS。
取消选中“只读”框httpd配置文件文件的属性。如果你使用 MSI 安装程序,则有一个快捷方式指向httpd配置文件在开始菜单中的文件Helicon->ISAPI_Rewrite
将这些行添加到httpd配置文件:
ISAPI_Rewrite 指令httpd配置文件:
# Deny access to Subversion working copy administrative
# directories (.svn) and their contents
RewriteRule .*/\.svn\b.* . [F,I,O]
现在,任何对 .svn 目录或其内容的请求都将导致服务器出现 404 Not Found。
答案2
您可以确保 IIS 使用的任何用户帐户都无权访问 .svn 目录。
您可以手动执行此操作(不推荐),也可以使用类似 MrJangles 的删除脚本,该脚本可以在您执行 SVN 更新后触发运行,也可以作为计划任务定期运行:
for /r YOURPATH %f in (.svn) do icacls /deny <name_of_iis_user>:F "%f"
(注意:我没有测试过上述内容,在生产中依赖它之前,您需要检查它是否执行了它所尝试的操作,有关更多信息,请参阅“icacls /help”的输出)
(另请注意:“icacls”是 Vista/2008 命令,在早期的 Windows 版本中,该命令为“cacls”)
答案3
使用 IIS 7,打开 IIS 管理器,选择服务器节点,双击处理程序映射功能。单击操作添加托管处理程序并按如下方式配置处理程序:
- 请求路径:*.svn/*(所有 .svn 文件夹中的所有文件的通配符映射)
- 类型:系统.Web.HttpForbiddenHandler
- 姓名:Subversion 元数据(如果你愿意,可以选择其他名称)
现在,对所有站点中名为 .svn 的 Subversion 元数据文件夹中的文件的任何请求都应返回以下内容:
‘/’应用程序中的服务器错误。
不提供此类页面。
描述:您请求的页面类型无法使用,因为该页面已被明确禁止。请检查以下 URL 并确保其拼写正确。
请求的 URL:/.svn/text-base/Default.aspx.svn-base
如果需要,您可以选择不同的处理程序类型,也许是返回 404 状态代码的 FileNotFound 处理程序。
对于 IIS 6 (已安装并配置 ASP.NET 2):
导航到主目录 > 配置 > 映射并将.svn-base
扩展映射到%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
。然后在 machine.config 中(您可以在中找到%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\CONFIG
),您可以为扩展添加与上面相同的处理程序,将以下 XML 元素添加为元素的子元素<httpHandlers>
:
<add verb="*" path="*.svn-base" type="System.Web.HttpForbiddenHandler"/>
这只会阻止访问者请求源代码文件,他们仍然可以从 .svn 文件夹请求其他文件。将更多扩展名映射到 aspnet_isapi.dll 或进行通配符映射(会影响性能),您可以阻止更多文件被请求。
答案4
不要使用 subversion。说真的。
从您的评论来看,您使用的工具似乎不对。Subversion 是开发人员的好工具,但它不是部署/镜像工具。如果您的目标只是以最少的带宽和时间将文件从暂存/测试服务器复制到生产服务器,那么我建议您使用同步。现在,由于我是一名 Unix 管理员,可能有一些我不知道的与 rsync 等效的 Windows 版本,因此您可能需要进行一些研究。但是,您可以在以下版本中使用 rsync赛格威或者同步。
Rsync 允许你将一台服务器上的目录与另一台服务器上的目录进行镜像。它会计算两台服务器之间的增量,然后仅有的复制差异。不仅如此,它还会压缩差异,还可以选择加密差异。