【问题标题】:Express js prevent GET /favicon.icoExpress js 阻止 GET /favicon.ico
【发布时间】:2016-05-26 07:48:46
【问题描述】:

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

【问题讨论】:

    标签: node.js express


    【解决方案1】:

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

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

    • 提供一个位于您网站根目录的favicon.ico 文件。
    • 使用serve-favicon 等模块将请求指向特定文件。
    • 捕获favicon.ico 请求并发送204 No Content 状态:
    app.get('/favicon.ico', (req, res) => res.status(204));
    

    【讨论】:

    • 我提交了对上述响应的修改,表明发送204 响应比200 更合适。
    • 在 Express 4 中,res.sendStatus(204);
    • sendStatus(204) 真的没有意义。 sendStatus 目的是设置与状态码匹配的响应正文。在 204 的情况下,没有响应正文。只需res.status(204).end()
    • app.get('/favicon.ico', (req, res) => res.status(204).end()); 是我最终使用的,工作完美,干净且有意义。
    【解决方案2】:

    我首选的方法是中间件

    把它放在某个地方:

    function ignoreFavicon(req, res, next) {
      if (req.originalUrl.includes('favicon.ico')) {
        res.status(204).end()
      }
      next();
    }
    

    然后:

    app.use(ignoreFavicon);
    

    【讨论】:

    • 204 状态码表示“无内容”,但您提供的是 JSON。它应该是响应长度为 0。
    • 更合适的回复是res.status(204).end()
    • @camaulay 注意到
    【解决方案3】:

    我同意@Blair Anderson 的观点,即中间件是这里最好的做法,但204 should not return a body。此外,您可能想要捕获 all 图标请求,例如: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();
    
    });
    

    【讨论】:

    • 由于对 favicon 的请求并不总是以 favicon.ico 的形式出现,因此您可以对 && 表达式的后半部分执行此操作: req.originalUrl.split('/').pop().includes('favicon'))。请注意,我将 ES6 用于 includes,对于 ES5,使用 indexof
    【解决方案4】:

    对于网络应用程序,我们应该从静态资源中提供一个 favicon.ico,或者直接通过 vanilla 提供服务,或者使用 express 中间件 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();    
    });
    

    【讨论】:

      猜你喜欢
      • 2012-03-28
      • 2015-02-05
      • 2021-12-17
      • 2017-09-12
      • 2015-07-05
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多