我需要限制对目录“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;
}