2013-03-03 21 views
21

Abbiamo bisogno di rimuovere l'intestazione etag da tutte le risposte HTTP nella nostra applicazione Node.js Express. Abbiamo un'API di servizi Web scritta in Express in cui vengono visualizzati risultati imprevisti sul client quando inviamo gli etags e il client restituisce l'intestazione if-none-match.Disabilita etag Header in Express Node.js

Abbiamo provato app.disable('etag') e res.removeHeader('etag'), ma nessuno dei due funziona; l'app invia l'intestazione indipendentemente.

Esistono altri modi per disattivare questa intestazione in tutte le risposte?

risposta

34

app.disable('etag') dovrebbe funzionare ora, c'è stata una richiesta di pull fusa per affrontare questo:

https://github.com/visionmedia/express/commit/610e172fcf9306bd5812bb2bae8904c23e0e8043

UPDATE: come Bigood sottolineato nei commenti del nuovo modo di fare le cose è la seguente

app.set('etag', false); // turn off 

cambiamento si è verificato con la versione 3.9.0: https://github.com/strongloop/express/releases/tag/3.9.0

Per ulteriori opzioni sull'impostazione di etag, controllare i documenti 4.x qui: http://expressjs.com/4x/api.html#app.set

+0

Cool. Contrassegnato come la risposta corretta! – Raj

+8

C'è un modo per disabilitare gli etags solo per determinati endpoint? Non desidero gli etags sui miei endpoint ma desidero gli etags sul contenuto statico. – Zambonilli

+0

Non funziona in questo modo dal 3.9.0: https://github.com/strongloop/express/releases/tag/3.9.0 – Bigood

2

Mi sembra che la vera soluzione al tuo problema sarebbe capire perché si sta comportando in modo strano a causa degli etags.

Per rispondere alla domanda, Express non supporta attualmente la disattivazione delle intestazioni di etags. In realtà è stato discusso e unito in this pull request, ma in seguito è stato ripristinato. Se hai davvero bisogno di questo e non vuoi provare a risolvere il problema di root, puoi sempre applicare quella patch e andare da lì.

+1

Y! Slow suggerisce di rimuovere gli etags. – chovy

+0

Ho visto anche quella richiesta pull, ma speravo in un metodo standard supportato dal framework piuttosto che in una modifica che non sarebbe stata supportata in futuro. – Raj

+1

Sembra che abbiano finito per rimandarlo indietro: https://github.com/visionmedia/express/pull/1694 –

2

Esaminando express.js, gli ETag vengono inviati solo quando il metodo di richiesta è GET. È possibile impedire a express di inviare messaggi nella risposta impostando request.method su qualcos'altro prima di chiamare response.send().

esempio:

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}); 
}); 

Questo ha funzionato bene per me.

19
app.disable('etag') 

Questo disabiliterà l'intestazione etag per tutte le richieste, ma non per i contenuti statici. Quanto segue lo fa per il contenuto statico:

app.use(express.static(path.join(__dirname, 'public'), { 
     etag: false 
})); 
+1

Questo è importante in quanto è facilmente dimenticato – migg

+0

Questo non è documentato, ma funziona anche per 'res.sendFile ('...', {etag: false})'. Nel mio caso, 'app.disable ('etag')' e 'app.set ('etag', false)' non ha funzionato. – youen