【发布时间】:2016-05-26 07:48:46
【问题描述】:
在每个请求中,我的服务器都会接收到 /favicon.ico 的 GET 请求,即使它是不包含 html 文件的 REST api。为什么会发生这种情况?如何阻止此请求?
【问题讨论】:
在每个请求中,我的服务器都会接收到 /favicon.ico 的 GET 请求,即使它是不包含 html 文件的 REST api。为什么会发生这种情况?如何阻止此请求?
【问题讨论】:
默认情况下,浏览器会尝试从主机名的根目录请求/favicon.ico,以便在浏览器选项卡中显示图标。
如果您想避免此请求返回 404,您可以:
favicon.ico 文件。favicon.ico 请求并发送204 No Content 状态:app.get('/favicon.ico', (req, res) => res.status(204));
【讨论】:
204 响应比200 更合适。
res.sendStatus(204);
sendStatus(204) 真的没有意义。 sendStatus 目的是设置与状态码匹配的响应正文。在 204 的情况下,没有响应正文。只需res.status(204).end()。
app.get('/favicon.ico', (req, res) => res.status(204).end()); 是我最终使用的,工作完美,干净且有意义。
我首选的方法是中间件
把它放在某个地方:
function ignoreFavicon(req, res, next) {
if (req.originalUrl.includes('favicon.ico')) {
res.status(204).end()
}
next();
}
然后:
app.use(ignoreFavicon);
【讨论】:
res.status(204).end()
我同意@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.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();
});
【讨论】: