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


42

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

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

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


请注意,以我的经验,仅当在Linux上运行nginx时,定位功能才能正常工作。在Windows上运行时,我们遇到了无法正常工作的麻烦……
samsmith

Answers:


43

在一个位置条目中限制对nginx中多个目录的访问

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

7
您应该返回403,而不是404
Stillmatic1985

12
这根本无法回答问题。

1
返回403会提示该文件夹存在,而404则根本不显示该文件夹存在的证据
Don Wilson

23

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

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

16

为确保选择了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位置。文档中的以下注释是我基于上述解决方案的基础:

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


11
location /foo {
    deny all;
    return 404;
}

由于拒绝全部,这将一直给您403 ...当您希望服务器给您404时,只返回404 ...就像这样:

location /foo {
    return 404;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.