Экспресс js предотвращает GET/favicon.ico

В каждом запросе мой сервер получает запрос GET в /favicon.ico, даже если он REST api, который не включает html файл. Почему это происходит и как я могу предотвратить этот запрос?

Ответ 1

Браузеры по умолчанию попытаются запросить /favicon.ico из корня имени хоста, чтобы отобразить значок на вкладке браузера.

Если вы хотите, чтобы этот запрос не возвращал 404, вы можете:

  • favicon.ico файл favicon.ico, доступный в корневом каталоге вашего сайта.
  • Используйте такой модуль, как service-favicon, чтобы указать запросы к определенному файлу.
  • Поймать запрос favicon.ico и отправить статус 204 No Content:

    app.get('/favicon.ico', (req, res) => res.status(204));

Ответ 2

мой предпочтительный метод - это промежуточное ПО

Поместите это где-нибудь:

function ignoreFavicon(req, res, next) {
  if (req.originalUrl === '/favicon.ico') {
    res.status(204).json({nope: true});
  } else {
    next();
  }
}

тогда:

app.use(ignoreFavicon);

Ответ 3

Я думаю, вы имеете в виду, что ваш сервер получает такой запрос. Обычно браузер пытается отобразить значок на вкладке. Особенно Chrome очень агрессивен (по крайней мере, это мое наблюдение).
Что вы можете сделать, так это правильно обрабатывать запрос на ваши HTML-страницы и игнорировать его для вызовов API (поскольку они, вероятно, обычно не будут выполняться на переднем плане с помощью браузера)

Ответ 4

Я согласен с @Blair Anderson в том, что промежуточное ПО - лучший способ действий здесь, но 204 не должен возвращать тело. Кроме того, вы можете захотеть поймать все запросы favicon, например: https://example.com/some/path/favicon.ico. В этом случае что-то вроде этого лучше всего работает:

app.use( function(req, res, next) {

  if (req.originalUrl && req.originalUrl.split("/").pop() === 'favicon.ico') {
    return res.sendStatus(204);
  }

  return next();

});