2012-07-30 129 views
78

我有以下.htaccess文件:如何拒绝访问文件在.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 

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

回答

137

在htaccess文件中,<Files>指令的范围仅适用于该目录(为了避免在子目录的htaccess中的规则/指令从父级应用取代应用时出现混淆,我想这应该避免混淆。

所以,你可以有:

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

在htaccess文件在你的inscription目录。或者你可以使用mod_rewrite来排序的处理这两种情况下拒绝访问htaccess文件以及log.txt的:

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

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

如果您使用的是IIS,在web.config文件中做到这一点,而不是。 – 2014-11-03 16:33:09

+0

使用重写规则会拒绝我自己的代码访问* .txt的内容。你如何解决这个问题? – Pantss 2015-12-06 05:34:53

+3

“''指令的范围仅适用于该目录” - 否则不适用。它适用于该目录_and_下面的所有子目录。所以''文件“log.txt”>'会抓住'/ log.txt' _and_'/inscription/log.txt'。 – MrWhite 2017-01-30 15:45:13

13

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

  • 的.htaccess
  • 的.htaccess
  • 的.htaccess
  • testFILE.htaccess
  • filename.HTACCESS
  • FILEROOT。 hTaCcEsS

..等等。显然,这种方法效果很好保护您网站的HTAccess文件。此外,该技术还包括强化“满足所有”指令。请注意,此代码应放置在您的域的根HTAccess文件中:

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

使用此代码时,出现500内部服务器错误。任何想法为什么?我正在使用Wordpress。 – 2015-01-26 21:25:15

+3

禁止用户访问点文件是否更有意义?使用类似“'。 – 2016-11-15 09:12:22

7

我不相信目前接受的答案是正确的。例如,我有以下.htaccess文件在虚拟服务器的根(阿帕奇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外部访问这是在一个子目录中。 我有我的Apache 2.2的服务器上使用相同的效果类似的.htaccess文件:

<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.txt相同的目录中会比较简单,在inscription目录中,它将在那里工作。

+0

你得到我的upvote,这也适用于我的apache 2.4。 – Tschallacka 2018-01-24 20:38:23

0

放置在.htaccess文件下面的行和替换文件名,如你所愿

RewriteRule ^(test\.php) - [F,L,NC] 
-2

那么你可以使用<Directory>标签 例如:

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

不要使用./因为如果您只是使用/它会查看您网站的根目录。

对于更详细的例子访问http://httpd.apache.org/docs/2.2/sections.html

+1

但''.htaccess'中不允许有''容器。在'.htaccess'中,'.htaccess'文件本身就是“_Directory_容器”(每个目录的配置文件)。 – MrWhite 2017-01-30 13:47:32

+0

那么你可以使用重定向。 'Redirect /inscription/log.txt access_denied.html'如果用户转到铭文目录中的“inscription/log.txt”,这会将用户重定向到'access_denied.html'。 – 2017-01-30 14:47:01