2012-07-13 10 views
9

Sono relativamente nuovo a node.js, Express e allo sviluppo mobile e ho riscontrato un problema che penso abbia a che fare con l'invio di intestazioni con Express.Le intestazioni non impostano con il reindirizzamento utilizzando node.js/Express

L'utente inizia alla pagina iniziale '/', non ha effettuato l'accesso, quindi fa clic su un pulsante per andare alla pagina di accesso. Al momento della presentazione il loro nome utente e password per '/ validate_signin', dovrebbero essere reindirizzati alla home page, questa volta con la home page che mostra in modo diverso perché sono registrati nel

Il reindirizzamento funzionava così:.

Questo funziona perfettamente sul mio portatile, ma sul mio telefono cellulare reindirizza a "/", nel suo stato precedente, presumibilmente a causa del caching. Se aggiorno la pagina sul telefono, "/" verrà visualizzato come dovrebbe.

ho trovato questo post: How to control web page caching, across all browsers?

hanno cercato di impostare le intestazioni nei seguenti due modi (a parte), ma non sembrano essere l'invio:

res.header("Cache-Control", "no-cache, no-store, must-revalidate"); 
res.header("Pragma", "no-cache"); 
res.header("Expires", 0); 

res.writeHead(302, { 
    "location": "/", 
    "Cache-Control" : "no-cache, no-store, must-revalidate", 
    "Pragma": "no-cache", 
    "Expires": 0 
}); 

Ecco le intestazioni che attualmente sto ricevendo:

HTTP/1.1 304 Not Modified 
X-Powered-By: Express 
Date: Fri, 13 Jul 2012 17:35:18 GMT 
Cache-Control: public, max-age=0 
Last-Modified: Fri, 13 Jul 2012 12:32:12 GMT 
Etag: "3223-1342182732000" 
Accept-Ranges: bytes 
Connection: keep-alive 

Qualche idea?

Molte grazie.

+1

Queste intestazioni devono essere scritte nella pagina che non si desidera memorizzare nella cache ('/'), non nella pagina in cui si sta eseguendo il reindirizzamento, giusto? –

+0

corretto. Sì, probabilmente li sto mettendo nel posto sbagliato. Andando a guardare in questo. –

+0

Il tuo problema non riguarda il caching del browser. Per qualsiasi motivo, Express sta inviando un 304 anziché un reindirizzamento effettivo e il browser sta rispondendo in modo appropriato (ovvero mantenendo la versione precedente). Sembra una sorta di caching interno fatto da Express; stai per caso usando express.static per servire la pagina in questione? – ebohlman

risposta

10

Vorrei commentare ma mi sono appena iscritto oggi e non ho punti reputazione.

Se ho capito bene, stai servendo la pagina usando express.static (quindi è solo una semplice pagina HTML) ma se l'utente è registrato, tu usi il router express, sono corretto?

Sto anche indovinando che hai inserito il codice indicato per impostare le intestazioni nel percorso della homepage.

In questo caso, il problema non è la memorizzazione nella cache del browser, a causa della natura dei middleware connect.

I middleware vengono eseguiti in una catena, chiamando il successivo quando hanno finito, il che significa che se ho assunto correttamente, express.static viene chiamato prima del router e serve semplicemente la pagina HTML statica.

Quindi il percorso non viene mai eseguito perché express.static non chiamerà next() (per ovvi motivi, il file esiste).

Spero di aver ragione.


Edit:

Sembra che ho assunto sbagliato. Hai detto che funziona benissimo sul tuo laptop, quindi sembra decisamente un problema di caching sul lato client.

Non sono ancora sicuro di come esista una pagina diversa utilizzando express.static() o dove posizioni il codice che hai menzionato sopra, ho intenzione di fare un tentativo senza vedere il tuo codice ma potrebbe essere necessario per me e per gli altri per aiutarti.

Queste intestazioni di risposta devono essere impostate nella prima risposta (quando si visita la home page), non ha nulla a che fare con il reindirizzamento. Mettiamo la parte di redirezione a parte, per ora.

ho scritto un rapido (esprimere) Esempio:

var express = require('express'), 
    http = require('http') 
    app = express(); 

app.configure(function() { 
    app.set('port', process.env.PORT || 3000); 
    app.use(express.logger('dev')); 

    /* 
    * Here's where I set the headers, make sure it's above `express.static()`. 
    * 
    * Note: You can safely ignore the rest of the code, (it's pretty much "stock"). 
    */ 
    app.use(function noCachePlease(req, res, next) { 
    if (req.url === '/') { 
     res.header("Cache-Control", "no-cache, no-store, must-revalidate"); 
     res.header("Pragma", "no-cache"); 
     res.header("Expires", 0); 
    } 

    next(); 
    }); 

    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function() { 
    app.use(express.errorHandler()); 
}); 

http.createServer(app).listen(app.get('port'), function() { 
    console.log("Express server listening on port " + app.get('port')); 
}); 

Questo codice istruisce il mio browser non mettere in cache della pagina.

intestazioni di risposta ottengo senza il noCachePlease middleware:

Accept-Ranges bytes 
Cache-Control public, max-age=0 
Connection keep-alive 
Content-Length 5 
Content-Type text/html; charset=UTF-8 
Date Fri, 20 Jul 2012 19:25:38 GMT 
Etag "5-1342811956000" 
Last-Modified Fri, 20 Jul 2012 19:19:16 GMT 
X-Powered-By Express 

intestazioni di risposta ottengo con la noCachePlease middleware:

Accept-Ranges bytes 
Cache-Control no-cache, no-store, must-revalidate 
Connection keep-alive 
Content-Length 5 
Content-Type text/html; charset=UTF-8 
Date Fri, 20 Jul 2012 19:26:08 GMT 
Etag "5-1342811956000" 
Expires 0 
Last-Modified Fri, 20 Jul 2012 19:19:16 GMT 
Pragma no-cache 
X-Powered-By Express 

Quindi, come potete vedere, funziona ma potresti eseguire questo codice da solo.

Se si desidera eseguirlo, è necessario disporre di express in node_modules o installato a livello globale (con il flag -g).

+0

Grazie per la risposta/commento.In realtà, io uso express.static per entrambi i casi.Quando la pagina viene caricata (anziché essere solo presa dalla cache), dovrebbe fare una chiamata a '/ issignedin /' tramite ajax, e in base a ciò, javascript caricherà il layout di pagina appropriato Qui puoi vedere il sito: http://184.73.213.206:8080/ –

+0

@Nathan La mia ipotesi non era corretta. sicuramente la mia risposta aggiornata (con un esempio funzionante) sarebbe utile. Se non lo è ancora, forse dovresti postare alcune parti rilevanti del tuo codice (probabilmente middleware e percorsi) – samitny

+0

Grazie per il grande esempio. , ma sto ottenendo la stessa risposta, anche dopo aver svuotato la cache del mio browser e riprovando. Ne esaminerò un po 'di più, quindi pubblicherò il mio codice. Grazie ancora. –

Problemi correlati