拒绝来自子目录htaccess中的所有内容,而不是覆盖root htaccess中的文件规则

时间:2013-07-12 09:31:46

标签: apache .htaccess

我遇到的情况是我试图拒绝访问我网站子目录中的所有文件。我在这个子目录中添加了一个htaccess文件,并在所有指令中添加了deny。但是,我在站点根目录中也有一个htaccess文件,它允许特定的文件类型,看起来这些文件类型仍然可以在子目录中访问,即使我不再需要它们。我有一个解决方法(见下文),但我觉得必须有一个更好的方法。这是我的两个htaccess文件:

Root .htaccess

# Deny access to everything by default
Order Deny,Allow
deny from all

# Allow access to html files
<Files *.html>
    allow from all
</Files>

子目录.htaccess

# Deny access to everything
deny from all

解决方法:

子目录.htaccess

# Deny access to everything
Order Allow,Deny
deny from all
<Files *.*>
    deny from all
</Files>

这就是我想要的,但我觉得应该有办法让所有陈述单独拒绝。有谁知道怎么做?

3 个答案:

答案 0 :(得分:14)

你可以像这样使用你的Root .htaccess

# Deny access to everything by default
Order Deny,Allow
deny from all

# Allow access to html files
<Files *.html>
    allow from all
</Files>

# Deny access to sub directory
<Files subdirectory/*>
    deny from all
</Files>

子目录中不需要单独的.htaccess。

您允许访问根目录中.htaccess中的所有html文件,而不是在第一种情况下拒绝它在子目录中的任何位置。与防火墙(使用第一个规则匹配命中)不同,Apache解析所有规则并使用最后一个匹配规则。首先读取全局规则,然后再读取特定规则。

答案 1 :(得分:6)

apache中的指令顺序真的不明显。

您可以在文档"How the sections are merged"上找到完整的说明。

以下是摘录:

  

合并的顺序是:

     
      
  • <Directory>(正则表达式除外)和.htaccess同时完成(使用.htaccess,如果允许,覆盖<Directory>
  •   
  • <DirectoryMatch>(和<Directory ~>
  •   
  • <Files><FilesMatch>同时完成
  •   
  • <Location><LocationMatch>同时完成
  •   
  • <If>
  •   

所以会发生的是<File>指令在目录之后处理(因为.htaccess实际上是当前目录的Directory指令)。

它适用于您的给定示例,因为这些文件指令实际上嵌套在.htaccess Directory指令中,第二个File指令应用于父目录之后。

您不能在父级中使用<FileMatch>指令,其中将排除子目录中的文件,因为fileMatch仅处理文件名,而不处理文件路径。但你可以尝试使用LocationMatch,但它可能会以一个相当复杂的方式结束,也禁止使用带点的位置黑客。

实际上我在这里使用的解决方案是父文件夹中的RedirectMatch:

RedirectMatch 403 ^.*\.html$

答案 2 :(得分:0)

在找到这个线程后,我有一段时间无法让它工作,然后我找到了原因,因此我的答案是(希望)帮助将来遇到同样问题的人。

我复制了@bansi 的回答,如下所示:

#Deny access to everything by default.
Order Deny,Allow
deny from all

# Allow access to the root index.php.
<Files index.php>
    allow from all
</Files>

#allow access to the other .PHP files
<Files pages/*.php>
    allow from all
</Files>

它确实部分起作用了,我无法访问我的 js 文件夹中的任何 javascript 文件,或不在 pages 文件夹中的 .PHP 文件。 但是我无法访问根文件夹中的 index.php 文件,即使它在规则中。问题原来是因为我也将 /index.php 改写为 -> /home 像这样:

 RewriteRule ^home$ index.php [L]

解决方案是添加这个:

<Files home>
    allow from all
</Files>