【问题标题】:Apache configuration: Regex to disable access to files/directories beginning with a dotApache 配置:正则表达式禁用对以点开头的文件/目录的访问
【发布时间】:2011-05-20 03:49:27
【问题描述】:

我想禁止访问任何名称以点开头的文件或目录。我想出了以下方法,但只有当它们直接位于 Document 根目录中时,它才会禁用对以 DOT 开头的文件/目录的访问。

<Files ~ "^\.|\/\.">
    Order allow,deny
    Deny from all
</Files>

有了这个,

http://my_server.com/.svn/entries   --> Permission denied
http://my_server.com/abcd/.svn/entries  --> Accessible, should be disabled

实现此目的的正确正则表达式是什么?

【问题讨论】:

    标签: regex apache .htaccess


    【解决方案1】:

    这对我来说非常有效(Apache 2.4):

    <LocationMatch "\/\.">
        Require all denied
    </LocationMatch>
    

    拒绝任何包含以点(文件或目录)开头的组件的 URL。

    【讨论】:

      【解决方案2】:
      RewriteRule (^\.|/\.) - [F]
      

      这将拒绝查看以点开头的任何文件或目录。 它会影响路径树中的任何级别。

      末尾的[F]修饰符表示禁止访问(L修饰符不需要说它是最后应用的规则,默认情况下是隐含的)。

      正则表达式有两部分(任何一个都可以匹配,不需要两者都匹配):

      (part1|part2)
      

      第一部分匹配以点开头的任何内容(当您在每个目录的 .htaccess 文件中使用它并且我们匹配的字符串的开头不会有斜杠时):

      ^\.
      

      例如,这适用于.test.git/HEAD 但不适用于/.gitpath/.hidden

      第二部分匹配任何包含斜线和点的内容。如果您在 VirtualHost 或横向 Apache 配置中有此规则,这很有用,在这种情况下,我们匹配的字符串可能以斜杠开头。

      此规则将匹配:/.gitsome/.hidden 此规则将不匹配:.git.hidden

      当我们结合这两个规则时,似乎我们涵盖了所有可能的情况。

      【讨论】:

        【解决方案3】:

        带重写模组:

        RewriteEngine on
        
        RewriteCond %{THE_REQUEST} ^.*/\.
        RewriteRule ^(.*)$ - [R=404]
        

        每个以点开头的文件或目录都将被重定向到 404。

        /myDir/.svn => 404
        /.gitignore => 404
        /dir1/dir2/dir3/..../.toHide => 404
        

        【讨论】:

          【解决方案4】:

          您的代码不起作用,因为&lt;Files&gt; 仅适用于所请求文档的基本名称。即最后一个斜线之后的部分。 (来源:http://httpd.apache.org/docs/current/mod/core.html#files

          Apache 在默认安装中阻止.htaccess 文件(更好的是:所有以.ht 开头的文件)。如果您仔细查看配置文件,您会看到如下内容:

          <FilesMatch "^\.ht">
              Order allow,deny
              Deny from all
          </FilesMatch>
          

          所以要隐藏所有以点开头的文件,您可以使用:

          <FilesMatch "^\.">
              Order allow,deny
              Deny from all
          </FilesMatch>
          

          为了使其适用于以点开头的目录,请使用以下(经过测试的)代码:

          <DirectoryMatch "^\.|\/\.">
              Order allow,deny
              Deny from all
          </DirectoryMatch>
          

          【讨论】:

          • 除了反复试验之外,还有其他方法可以测试这些正则表达式吗?他们似乎没有遵循我熟悉的 Regex 规则。例如。 ^/protected/.* 匹配 /protected/file.txt 和 ^/(folder1|folder2)/.* 不匹配 /folder1/file.txt 但 /folder1/.* 匹配。
          • 我认为正斜杠不需要转义。另外,DirectoryMatch 正则表达式可以写成更紧凑的形式:&lt;DirectoryMatch "/\."&gt; 或类似以下内容以排除 .well-known &lt;DirectoryMatch "/\.(?!well-known)"&gt;。记得注意.well-known这个目录是标准化的,一般情况下不应该被禁止。
          猜你喜欢
          • 2021-08-20
          • 1970-01-01
          • 2020-10-26
          • 1970-01-01
          • 1970-01-01
          • 2013-11-23
          • 1970-01-01
          • 2023-01-11
          • 2017-12-10
          相关资源
          最近更新 更多