Express js prevent GET /favicon.ico
node.jsExpressnode.js Problem Overview
In every request, my server is receiving GET request to /favicon.ico, even when it's REST api that not include html file. Why is this happening and how can I prevent this request?
node.js Solutions
Solution 1 - node.js
Browsers will by default try to request /favicon.ico
from the root of a hostname, in order to show an icon in the browser tab.
If you want to avoid this request returning a 404, you can either:
- Supply a
favicon.ico
file that is available at the root of your site. - Use a module such as serve-favicon to point requests to a specific file.
- Catch the
favicon.ico
request and send a204 No Content
status:
app.get('/favicon.ico', (req, res) => res.status(204));
Solution 2 - node.js
my preferred method is middleware
put this somewhere:
function ignoreFavicon(req, res, next) {
if (req.originalUrl.includes('favicon.ico')) {
res.status(204).end()
}
next();
}
then:
app.use(ignoreFavicon);
Solution 3 - node.js
I agree with @Blair Anderson that middleware is the best course of action here but 204
should not return a body. Also, you may want to catch all favicon request e.g.: https://example.com/some/path/favicon.ico. In which case something like this works best:
app.use( function(req, res, next) {
if (req.originalUrl && req.originalUrl.split("/").pop() === 'favicon.ico') {
return res.sendStatus(204);
}
return next();
});
Solution 4 - node.js
In Case of web apps, we should supply a favicon.ico from static resources either serving directly via vanilla or by making use of express middleware serve-favicon
In the case of API apps, we should supply 204 (no content) status code which will result in a success roundtrip.
We can make use of sendStatus()
method to respond with status code 204 (no content)
app.get('/favicon.ico', function(req, res) {
res.sendStatus(204);
});
if you are using status(204)
make sure to use end()
as well.
Otherwise, the request will remain in pending status.
app.get('/favicon.ico', function(req, res) {
res.status(204);
res.end();
});