全部拒绝被另一个位置块覆盖

全部拒绝被另一个位置块覆盖
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 文档有关于哪个位置块将应用于给定请求的有用信息。引用:

  1. 带有“=”前缀的指令与查询完全匹配。如果找到,则搜索停止。
  2. 所有剩余指令均带有常规字符串。如果此匹配项使用了“^~”前缀,则搜索停止。
  3. 正则表达式,按照它们在配置文件中定义的顺序。
  4. 如果 #3 匹配成功,则使用该结果。否则,将使用 #2 的匹配结果。

相关内容