Express js阻止了GET /favicon.ico

时间:2016-02-15 11:54:41

标签: node.js express

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

5 个答案:

答案 0 :(得分:56)

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

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

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

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

答案 1 :(得分:12)

我首选的方法是中间件

把它放在某个地方:

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

然后:

app.use(ignoreFavicon);

答案 2 :(得分:3)

我认为您的意思是您的服务器收到了这样的请求。通常,浏览器会尝试在选项卡上显示一个图标。特别是Chrome非常具有攻击性(至少是我的观察) 您可以做的是正确处理HTML页面的请求并忽略API调用(因为它们通常不会在浏览器的前台发生)

答案 3 :(得分:3)

我同意@Blair Anderson的观点,即中间件是最好的行动方案,但204 should not return a body。此外,您可能希望捕获所有 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();

});

答案 4 :(得分:1)

对于网络应用,我们应该从静态资源中提供favicon.ico,该静态资源要么直接通过Vanilla服务,要么通过使用快速中间件serve-favicon

对于 API应用,我们应提供204(无内容)状态代码,以确保成功往返。

我们可以利用sendStatus()方法以状态代码204(无内容)进行响应

app.get('/favicon.ico', function(req, res) { 
    res.sendStatus(204); 
});

如果您使用的是status(204),请确保也使用end()。 否则,请求将保持待处理状态。

app.get('/favicon.ico', function(req, res) { 
    res.status(204);
    res.end();    
});