Nginx access_log off - 应用于单个 URL 而不阻止其返回响应

Nginx access_log off - 应用于单个 URL 而不阻止其返回响应

我正在尝试关闭 laravel 应用程序中单个 url 的 access_log。

该网址是/ignore/this/url

我需要它简单地 - 对于这个 URL - 不要在 access_log 中记录信息,但我希望它能够像正常情况下那样被解析和运行。

正常的是:

server {
    listen 80;
    server_name localhost 127.0.0.1;
    access_log /vagrant/logs/access.log;
    error_log /vagrant/logs/error.log;

    client_max_body_size 32M;

    location / {
        root /vagrant/web;
        index index.html index.htm index.php;
        try_files $uri $uri/ /index.php?$args;

        location ~ \.php {
                fastcgi_pass unix:///var/run/php/php7.1-fpm.sock;
                fastcgi_index index.php;
                include /etc/nginx/fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_read_timeout 60;
        }
    }
}

我试过了:

    location /ignore/this/url {
        root /vagrant/web;
        index index.html index.htm index.php;
        try_files $uri $uri/ /index.php?$args;

        access_log off;

        location ~ \.php {
                fastcgi_pass unix:///var/run/php/php7.1-fpm.sock;
                fastcgi_index index.php;
                include /etc/nginx/fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_read_timeout 60;
        }

    }

但这一点似乎被忽略了。

我已尝试将其添加到主位置块内。

location / {
        root /vagrant/web;
        index index.html index.htm index.php;
        try_files $uri $uri/ /index.php?$args;

    location /ignore/this/url {
            access_log off;
        }

        location ~ \.php {
                fastcgi_pass unix:///var/run/php/php7.1-fpm.sock;
                fastcgi_index index.php;
                include /etc/nginx/fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_read_timeout 60;
        }

    }

但它会给我一个 404 错误“未找到文件”。

答案1

http {
   map $uri $do_log {
      /ignore/this/url 0;
      default 1;
   }

   server {
      ...
      access_log /var/log/nginx/nginx-access.log combined if=$do_log;
      
   }
}

答案2

万一对任何人都有用...接受的答案适用于我尝试的任何静态 url,但我的$uri变量每次都以 index.php 的形式出现在我的大多数 PHP 文件中,因为 URL 被重写,原因是

try_files /index.php?$args;

最后,我不得不对已接受的答案进行以下修改才能使其正常工作:

http {
   map $request $do_log {
      'GET /ignore/this/url HTTP/1.1' 0;
      default 1;
   }

   server {
      ...
      access_log /var/log/nginx/nginx-access.log combined if=$do_log;
      
   }
}

https://docs.nginx.com/nginx/admin-guide/monitoring/logging/

相关内容