Как я могу вернуть 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;
}