Как я могу вернуть 204 вместо 404 для отсутствующего файла favicon.ico в Nginx?

Для моих сайтов у меня обычно есть два server{} блоки: один обслуживает сайт, а другой - статический контент для этого сайта из другого домена. Поскольку favicon.ico файл всегда запрашивается из основного домена вместо статического домена, я должен обработать этот конкретный файл на сайте server{} блок, а не статический блок файла.

Когда favicon.ico файл не найден, Nginx возвращает мою страницу определения ошибки 404, а также код состояния HTTP 404. Однако я не хочу отправлять эти биты на мою симпатичную страницу 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 ответа

Я думаю, это то, что вы ищете:

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

Он попытается найти файл по URI или 204 как запасной вариант. Вот соответствующая документация.

Простой "location /favicon.ico { return 204; }" будет самым простым.

Важный момент заключается в том, что=и код состояния 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;
}
Другие вопросы по тегам