如何在Nginx中为缺少的favicon.ico文件返回204而不是404?

时间:2014-08-21 01:41:37

标签: nginx http-status-code-404 http-status-code-204

对于我的网站,我通常有两个server{}块:一个为网站服务,另一个为来自不同域的该网站提供静态内容。由于始终从主域而不是静态域请求favicon.ico文件,因此我必须在站点的server{}块中处理该特定文件,而不是静态文件块。

当找不到favicon.ico文件时,Nginx会返回我的定义404错误页面,以及404 HTTP状态代码。但是,我不想为我漂亮的404页面发送这些内容。 我想发送一个带有204状态代码的完全空响应。以下是我尝试过的,但它不起作用。有没有正确的方法来做到这一点? 这个想法是204会指示找到的文件,但是这是一个完全空白的图像。

另外,我尝试保存位实际上是一个坏主意吗? 如果实际上返回204而不是404是一个坏主意,是否更优雅返回空404页面的方法,而不创建一个新的实际空文件,并将其设置为该位置块内的error_page指令?

server {
    ...


    error_page  404          /../static/404.html;

    location @return_204 {
        return  204;
    }

    # Case-insensitive matching of .txt and .xml files.
    # (Example: robots.txt, crossdomain.xml, and sitemap.xml)
    location ~* \.(txt|xml)$ {
        try_files  $uri /../static/$uri;
    }

    location = /favicon.ico {
        log_not_found  off;
        error_page     404 = @return_204;

        try_files      $uri /../static/$uri;
    }

    ...
}

3 个答案:

答案 0 :(得分:8)

我认为这就是你要找的东西:

location = /favicon.ico {
         try_files $uri = 204;
}

它将尝试在URI或204处查找文件作为后备。 Here's the relevant documentation.

答案 1 :(得分:0)

简单的“location /favicon.ico {return 204;}”将是最简单的。

答案 2 :(得分:0)

重要一点是,= 和 HTTP 状态代码必须是一个字,并且必须不是之间的任何空间。如果您在它们之间留出一个空格,您的 error.log 会很快填满,因为 95% 的请求都有某种类型的 favicon.ico

应保存以下内容以供重复使用,并仅在必要时included。

# (i) No need to log presence or absence.
location = /favicon.ico {
  access_log     off;
  log_not_found  off;
  try_files      $uri  =204;
}