如何拒绝对.htaccess中文件的访问


112

我有以下.htaccess文件:

RewriteEngine On
RewriteBase /

# Protect the htaccess file
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>

# Protect log.txt
<Files ./inscription/log.txt>
Order Allow,Deny
Deny from all
</Files>

# Disable directory browsing
Options All -Indexes

我试图禁止访问者访问以下文件:

domain.com/inscription/log.txt

但是上面的内容不起作用:我仍然可以从浏览器远程访问文件。

Answers:


187

在htaccess文件中,<Files>伪指令的范围仅适用于该目录(我想避免在子目录htaccess中的规则/指令从父级应用到取代父级的​​规则/指令时产生混淆)。

因此,您可以:

<Files "log.txt">  
  Order Allow,Deny
  Deny from all
</Files>

对于Apache 2.4+,您可以使用:

<Files "log.txt">  
  Require all denied
</Files>

在您inscription目录中的htaccess文件中。或者,您可以使用mod_rewrite处理两种情况,即拒绝访问htaccess文件和log.txt:

RewriteRule /?\.htaccess$ - [F,L]

RewriteRule ^/?inscription/log\.txt$ - [F,L]

如果使用IIS,请在web.config文件中执行此操作。
Shaun Luttin 2014年

1
使用重写规则会拒绝我自己的代码访问* .txt的内容。您将如何解决?
裤子

8
<Files>指令的范围仅适用于该目录”-不,它不适用。它适用于该目录及其下的所有子目录。因此,<Files "log.txt">将捕获/log.txt /inscription/log.txt
怀特先生(MrWhite)

1
由于Order Allow,Deny2.4中已弃用,您是否可以更新此答案?
Telarian '18

18

强大的模式匹配 -这是我在《易腐出版社》中使用的方法。使用强模式匹配,此技术可防止外部访问包含“ .hta ”,“ .HTA ”或其大小写不敏感组合的任何文件。为了说明这一点,此代码将阻止通过以下任何请求进行访问:

  • .htaccess
  • .HTACCESS
  • .hTaCcEsS
  • testFILE.htaccess
  • 文件名.HTACCESS
  • 文件根目录

..etc等。显然,此方法在保护您站点的HTAccess文件方面非常有效。此外,该技术还包括强化的“ 满足所有人 ”指令。请注意,此代码应放在您域的HTAccess根文件中:

# STRONG HTACCESS PROTECTION
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>

1
使用此代码时出现500个内部服务器错误。知道为什么吗?我正在使用Wordpress。
Keryn Gill 2015年

8
只禁止用户访问点文件是否更有意义?使用类似的东西<Files ~"^\..*">
SteenSchütt,

1
在波浪号和第一个引号之间需要一个空格-至少对我来说我需要它。
〜SPACE

我获得了禁用.files的相同行为:<filesMatch“ ^ \ .. *”>命令允许,拒绝所有</ FilesMatch>
Pinonirvana

14

我不认为当前接受的答案是正确的。例如,我.htaccess在虚拟服务器(Apache 2.4)的根目录中有以下文件:

<Files "reminder.php">
require all denied
require host localhost
require ip 127.0.0.1
require ip xxx.yyy.zzz.aaa
</Files>

这样可以防止对reminder.php子目录中的文件的外部访问。我.htaccess在Apache 2.2服务器上有一个类似的文件,具有相同的效果:

<Files "reminder.php">
        Order Deny,Allow
        Deny from all
        Allow from localhost
        Allow from 127.0.0.1
     Allow from xxx.yyy.zzz.aaa
</Files>

我不确定,但我怀疑这是在.htaccess文件中专门定义子目录的尝试, <Files ./inscription/log.txt>导致其失败。将.htaccess文件放置在与log.txtinscription目录相同的目录中会更简单,它将在该目录中工作。


1
您得到我的支持,这也适用于我的Apache 2.4。
Tschallacka


-4

好吧,您可以使用<Directory>标签作为示例:

<Directory /inscription>
  <Files log.txt>
    Order allow,deny
    Deny from all
  </Files>
</Directory>

不要使用,./因为如果您仅使用/它,它将查找站点的根目录。

有关更详细的示例,请访问http://httpd.apache.org/docs/2.2/sections.html


2
但是<Directory>不允许使用容器.htaccess。在中.htaccess.htaccess文件本身是“ 目录容器”(每个目录的配置文件)。
怀特先生'17

好了,您可以使用重定向。如果用户进入题字目录,Redirect /inscription/log.txt access_denied.html这会将用户重定向到。access_denied.htmlinscription/log.txt
尼古拉斯英语
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.