为什么子位置会禁用 Nginx 中的父位置?

为什么子位置会禁用 Nginx 中的父位置?

我想关闭一个 php 文件的 access_log 。

location ~ \.php$ {
    location ~ ^/dontlog\.php$ {
        access_log off;
    }

    # fastcgi stuff
    ...
}

这使得 dontlog.php 不通过 fastcgi,它只是成为文本文件,而不是 php 脚本。其他 php 文件通过它。access_log off有效。

我不明白为什么会发生这种情况。是不是因为如果找到新位置,父位置就会被忽略?我尝试将其放在 fastcgi 代码之后,结果相同。

答案1

请参阅下面链接的博客文章,详细了解 nginx 继承。不幸的是,由于不同类型的配置选项以不同的方式继承,因此情况变得复杂。在您的示例中,我怀疑您使用的是fastcgi_pass,它不会继承。

动作指令是开始变得有趣的地方。它们被限制在一个上下文中,并且永远不会向下继承,但它们可以在多个上下文中指定,并且在某些情况下将针对每个上下文执行

https://blog.martinfjordvald.com/2012/08/understanding-the-nginx-configuration-inheritance-model/

还请注意以下示例(来自同一博客),该示例显示在嵌套块中设置单个 fastcgi_param 值将覆盖父级的所有值。

server {
    access_log /var/log/nginx/access.log;
    include fastcgi.conf;

    location ~ ^/calendar/.+\.php$ {
        access_log /var/log/nginx/php-requests.log; # If this executes then server context one never does.

        fastcgi_param ENV debug; # This *overwrites* the higher context array.
        include fastcgi.conf     # Therefore we include it in *this* context again.
    }
}

相关内容