如何限制对目录和子目录的访问

如何限制对目录和子目录的访问

我需要限制对目录“testdir”中任何文件或子目录的访问。我的配置:

...
location ~* ^.+\.(jpg|txt)$ {
            root   /var/www/site;
        }
location /testdir {
        deny all;
        return 404;
        }
...

在我的配置中,我对 /testdir/jpg_or_txt-files 没有任何限制。该怎么做?

答案1

要限制对 nginx 中一个位置条目中的多个目录的访问,请执行以下操作

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...

答案2

这是因为“root”指令在“deny”指令之前匹配。反转指令的顺序,它应该可以工作:

...
location /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
...

答案3

为了确保选择 testdir 匹配而不是 jpg/txt 匹配,请使用以下位置:

location ^~ /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}

在您的示例中,您有两种类型的位置。是前缀位置,因为和之间location /testdir没有波浪符号 ( ~) 。location/testdir

location ~* ^.+\.(jpg|txt)$是一个正则表达式位置(不区分大小写,因为在*波浪号后面有 )。从nginx 文档

为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的,则使用先前记住的前缀位置的配置。

这里的问题是,您的 testdir 位置被记住了,但在正则表达式阶段选择了 jpg/txt 位置,因为它匹配。文档中的以下注释是我基于我的解决方案(如上所述)得出的:

如果最长匹配的前缀位置有“^~”修饰符,则不检查正则表达式。

答案4

location /foo {
    deny all;
    return 404;
}

由于拒绝所有,这将始终为您提供 403...当您希望服务器为您提供 404 时,只需返回 404...如下所示:

location /foo {
    return 404;
}

相关内容