6

对于我的站点,我通常有两个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;
    }

    ...
}
4

3 回答 3

10

我想这就是你要找的:

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

它将尝试在 URI 或 204 处查找文件作为后备。 这是相关文档。

于 2014-12-10T05:00:46.200 回答
2

一个简单的

location /favicon.ico { return 204; }

将是最简单的。

于 2014-08-21T07:55:19.903 回答
0

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

为了可重用性,应保存以下内容,并include在必要时保存。

# (i) No need to log presence or absence.
location = /favicon.ico {
  access_log     off;
  log_not_found  off;
  try_files      $uri  =204;
}
于 2021-01-06T01:46:55.540 回答