Express js阻止了GET /favicon.ico

use*_*232 28 node.js express

在每个请求中,我的服务器都收到了对/favicon.ico的GET请求,即使它的REST api不包含html文件也是如此.为什么会发生这种情况?如何防止此请求?

dun*_*all 73

默认情况下,浏览器会尝试/favicon.ico从主机名的根目录进行请求,以便在浏览器选项卡中显示图标.

如果您想避免此请求返回404,您可以:

  • favicon.ico提供站点根目录下的文件.
  • 使用诸如serve-favicon之类的模块将请求指向特定文件.
  • 抓住favicon.ico请求并发送204 No Content状态:

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

  • 在Express 4中,`res.sendStatus(204);` (12认同)
  • 我提交了上述响应的编辑,表明发送'204`响应比'200`更合适. (4认同)
  • `app.get('/favicon.ico', (req, res) => res.status(204).end());` 是我最终使用的,工作完美,干净且有意义。 (4认同)
  • `sendStatus(204)` 并没有真正的意义。[`sendStatus`](https://expressjs.com/en/api.html#res.sendStatus) 目的是设置与状态代码匹配的响应正文。如果是 204,则没有响应正文。只需执行 `res.status(204).end()` 即可。 (2认同)

Bla*_*son 15

我首选的方法是中间件

把它放在某个地方:

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

然后:

app.use(ignoreFavicon);
Run Code Online (Sandbox Code Playgroud)

  • 204状态码表示“无内容”,但您正在提供JSON。响应长度应为0。 (5认同)
  • 更合适的响应是“res.status(204).end()” (2认同)
  • 收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”。通过在 else 条件下移动 next() 来修复它。 (2认同)

jwe*_*rre 5

我同意@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();

});
Run Code Online (Sandbox Code Playgroud)

  • 由于对收藏夹图标的请求并不总是以** favicon.ico **的形式出现,因此您可以在&&表达式的后半部分这样做:** req.originalUrl.split('/')。pop ().includes('favicon'))**。请注意,我将ES6用于** includes **,对于ES5,请使用** indexof **。 (2认同)