【问题标题】:How to deny access to a file in .htaccess如何拒绝访问 .htaccess 中的文件
【发布时间】:2012-07-28 13:29:45
【问题描述】:

我有以下 .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

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

【问题讨论】:

    标签: .htaccess


    【解决方案1】:

    在 htaccess 文件中,&lt;Files&gt; 指令的范围仅适用于该目录(我想是为了避免在子目录的 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 文件中执行此操作。
    • 使用重写规则会拒绝我自己的代码访问 *.txt 的内容。你将如何解决这个问题?
    • &lt;Files&gt; 指令的范围仅适用于该目录” - 不,它没有。它适用于该目录它下面的所有子目录。所以&lt;Files "log.txt"&gt; 将捕获/log.txt /inscription/log.txt
    • 由于 Order Allow,Deny 在 2.4 中已弃用,您能否更新此答案?
    【解决方案2】:

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

    • .htaccess
    • .HTACCESS
    • .hTaCcEsS
    • testFILE.htaccess
    • 文件名.HTACCESS
    • FILEROOT.hTaCcEsS

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

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

    【讨论】:

    • 使用此代码时出现 500 内部服务器错误。知道为什么吗?我正在使用 Wordpress。
    • 禁止用户访问点文件不是更有意义吗?使用类似&lt;Files ~"^\..*"&gt;.
    • 在波浪号和第一个引号之间需要一个空格——至少对我来说我需要它。 〜空格“
    • 我获得了相同的行为禁用 .files: order allow,deny deny from all
    【解决方案3】:

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

    <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 文件中专门定义子目录,viz &lt;Files ./inscription/log.txt&gt; 导致它失败。将.htaccess 文件放在与log.txt 相同的目录中会更简单,即在inscription 目录中,它可以在那里工作。

    【讨论】:

      【解决方案4】:

      将下面的行放在您的 .htaccess 文件中,并根据需要替换文件名

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

      【讨论】:

        【解决方案5】:

        你可以使用&lt;Directory&gt; 标签 例如:

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

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

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

        【讨论】:

        • 但是.htaccess 中不允许使用&lt;Directory&gt; 容器。在.htaccess 中,.htaccess 文件本身就是“Directory 容器”(每个目录的配置文件)。
        • 那么你可以使用重定向。 Redirect /inscription/log.txt access_denied.html 如果用户转到铭文目录中的inscription/log.txt,这会将用户重定向到access_denied.html
        猜你喜欢
        • 2018-06-22
        • 2011-05-11
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        • 2012-09-23
        • 2021-01-30
        • 2014-03-25
        相关资源
        最近更新 更多