Отключить заголовок etag в Express Node.js
Нам нужно удалить заголовок etag
из всех ответов HTTP в нашем приложении Node.js Express. У нас есть API веб-сервисов, написанный в Express, где неожиданные результаты видны у клиента при отправке etags, и клиент отправляет обратно заголовок if-none-match
.
Мы пробовали app.disable('etag')
и res.removeHeader('etag')
, но не работаем; приложение отправляет заголовок независимо.
Есть ли другие способы отключения этого заголовка во всех ответах?
Ответы
Ответ 1
app.disable('etag')
теперь должен работать, запрос на растяжение был объединен, чтобы справиться с этим:
https://github.com/visionmedia/express/commit/610e172fcf9306bd5812bb2bae8904c23e0e8043
ОБНОВЛЕНИЕ: как отметил Бидуд в комментариях, новый способ делать вещи следующий
app.set('etag', false); // turn off
Изменения произошли с версией 3.9.0: https://github.com/strongloop/express/releases/tag/3.9.0
Подробнее о настройке etag проверьте документы 4.x здесь: http://expressjs.com/4x/api.html#app.set
Ответ 2
app.disable('etag')
Это отключит заголовок etag для всех запросов, но не для статического содержимого. Ниже приведено статическое содержимое:
app.use(express.static(path.join(__dirname, 'public'), {
etag: false
}));
Ответ 3
Мне кажется, что реальное решение вашей проблемы будет заключаться в том, чтобы выяснить, почему она ведет себя странно из-за etags.
Чтобы ответить на ваш вопрос, в настоящее время Express не поддерживает отмену заголовков etags. Он был фактически обсужден и объединен в этом запросе на растяжение, но позже был отменен. Если вам это действительно нужно и вы не хотите исправлять проблему с корнем, вы всегда можете применить этот патч и перейти оттуда.
Ответ 4
Глядя на экспресс response.js, Etags отправляются только тогда, когда метод запроса GET.
Вы можете запретить экспресс отсылать etags в ответ, установив request.method на что-то еще до вызова response.send().
например:
app.get('/path/returnsJSON', function(req, res){
/* HACK to workaround the framework sending e-tags and "304 NOT MODIFIED" responses */
req.method="NONE"; // was "GET"
res.status(200).send({data:1});
});
Это работало нормально для меня.