![全部拒绝被另一个位置块覆盖](https://linux22.com/image/569946/%E5%85%A8%E9%83%A8%E6%8B%92%E7%BB%9D%E8%A2%AB%E5%8F%A6%E4%B8%80%E4%B8%AA%E4%BD%8D%E7%BD%AE%E5%9D%97%E8%A6%86%E7%9B%96.png)
location /_private {
deny all;
}
location ~ \.php$ {
# Workaround PHP vulnerability:
# http://forum.nginx.org/read.php?2,88845,page=3
try_files $uri =404;
include /etc/nginx/fastcgi_params;
keepalive_timeout 0;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/tmp/php.socket;
}
我想拒绝访问_private
目录中的所有内容。当我尝试访问时_private/a
,我得到了 403 错误,就像应该的那样。但是当我尝试访问时_private/b.php
,该deny all
部分被完全忽略。
答案1
使您的/_private
位置优先于正则表达式匹配:
location ^~ /_private {
就是这样。
这nginx 文档有关于哪个位置块将应用于给定请求的有用信息。引用:
- 带有“=”前缀的指令与查询完全匹配。如果找到,则搜索停止。
- 所有剩余指令均带有常规字符串。如果此匹配项使用了“^~”前缀,则搜索停止。
- 正则表达式,按照它们在配置文件中定义的顺序。
- 如果 #3 匹配成功,则使用该结果。否则,将使用 #2 的匹配结果。