【发布时间】:2011-09-02 19:13:57
【问题描述】:
我有一个网站,我使用 github(封闭源代码)来跟踪更改和更新网站。唯一的问题是,.git 目录似乎可以通过网络访问。我怎样才能停止这种情况并仍然能够使用 git?
我应该使用 .htaccess 吗? 我应该更改 .git 的权限吗?
【问题讨论】:
我有一个网站,我使用 github(封闭源代码)来跟踪更改和更新网站。唯一的问题是,.git 目录似乎可以通过网络访问。我怎样才能停止这种情况并仍然能够使用 git?
我应该使用 .htaccess 吗? 我应该更改 .git 的权限吗?
【问题讨论】:
把它放在你的网络服务器根的.htaccess文件中:
RedirectMatch 404 /\.git
此解决方案稳健且安全:它
.git 目录,即使有多个目录,.gitignore 和 .gitmodules .git 目录,并且【讨论】:
.git 文件夹上工作,但我仍然可以拉起 .gitignore 文件。
server config, virtual host, directory, .htaccess
RedirectMatch 404 /\.git.*
在.git 文件夹中创建一个.htaccess 文件并将以下内容放入该文件中:
Order allow,deny
Deny from all
但请注意,如果您重新克隆存储库,它将会丢失
【讨论】:
.git/ 目录本身,因为如果您重新克隆存储库,它会丢失。
.htaccess 和 .git/ 文件夹的权限都可以使用。我推荐前者:
<Directory .git>
order allow,deny
deny from all
</Directory>
【讨论】:
<Files>、<FilesMatch>)。
我不想在.git 目录中闲逛,也无法让Bennett's solution 在Apache 2.2 上工作,但将以下内容添加到我的<VirtualHost> 配置中是可行的:
RewriteRule ^.*\.git.* - [R=404]
【讨论】:
更强大和简单的选项是禁用.git 目录的读取和执行权限。
由于 Apache (httpd) 大多运行在一个特殊的用户帐户下,例如它在 CentOS 上以用户 apache 运行,而 .git 目录必须在真实用户帐户下创建,所以我们可以简单地阻止通过更改权限访问。而且,这种方式不会引入任何新文件,也不会影响 git 命令。
命令可以是:
chmod -R o-rx .git
【讨论】:
chmod。
我不习惯单独控制对我的 .git 文件夹的访问,而是选择通过 apache config 而不是 .htaccess 来完成,以防止我覆盖它们,或者忘记新安装等。
这里有一些详细的说明,希望对您有所帮助。我正在使用 Ubuntu 16.10。
【讨论】:
mod_rewrite 会给你想要的效果:
RewriteEngine on
RewriteRule .*\.git/.* - [F]
【讨论】:
.git目录的存在,因为它返回的是禁止代码而不是未找到。
与其像大多数答案所暗示的那样乱用.htaccess 规则,为什么不简单地将.git/ 目录放在webroot 之上?
在我的设置中,我的.git 目录通常位于以下位置:
/home/web/project_name/.git/
我的实际代码位于
/home/web/project_name/www_root/
由于我的网络根目录(在 Apache 或 Nginx 上定义。我更喜欢后者)是 /home/web/project_name/www_root/,因此无法从网络访问 .git 目录,因为它的位置“高于”网络根目录
【讨论】:
project_name 目录有两个子目录:www_root 是访问者浏览我的网站时实际提供的文件所在的位置,.git 是存储库所在的位置。从 repo 中提取更新 www_root 及其内容。问题是,由于.git 目录在层次上“高于”我的前端控制器,因此无法通过网络访问。
apache2 (LAMP) 服务器的解决方案 - 您有 2 个地方可以添加 .htaccess 内容。如果 1 个失败,请尝试下一个
在 /var/www/html 根目录下创建 .htaccess 文件并将代码粘贴到其中
<Directorymatch "^/.*/\.git/">
Order 'deny,allow'
Deny from all
</Directorymatch>
在虚拟主机文件中(/etc/apache2/sites-enabled/)>找到你的虚拟主机文件>打开文件>关闭虚拟主机标签后,粘贴
<Directorymatch "^/.*/\.git/">
Order 'deny,allow'
Deny from all
</Directorymatch>
无需重启服务器,在页面被调用时运行
【讨论】: