2012-07-13 13 views
9

Soy relativamente nuevo en node.js, Express y desarrollo móvil, y me he encontrado con un problema que creo que tiene que ver con el envío de encabezados con Express.Encabezados no configurados con redirección usando node.js/Express

El usuario comienza en la página de inicio '/', no ha iniciado sesión, luego hace clic en un botón para ir a la página de inicio de sesión. Al presentar su nombre de usuario y contraseña a '/ validate_signin', deben ser redireccionado a la página de inicio, esta vez con la página de inicio que muestra de manera diferente, ya que se registran en

La redirección trabajó como esto:.

res.redirect('/'); 

Esto funciona bien en mi computadora portátil, pero en mi teléfono móvil redirige a '/', en su estado anterior, presumiblemente debido a la colocación en caché. Si actualizo la página en el teléfono, '/' se mostrará como debería.

me encontré con este post: How to control web page caching, across all browsers?

han tratado de establecer cabeceras de las dos maneras siguientes (por separado), pero que no parece ser el envío:

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

Éstos son los encabezados que estoy recibiendo actualmente:

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 

¿Alguna idea?

Muchas gracias.

+1

Esos encabezados deberían estar escritos en la página que no desea almacenar en caché ('/'), no en la página en la que está redirigiendo, ¿no? –

+0

Correcto. Sí, probablemente los estoy colocando en el lugar equivocado. Yendo a mirar esto. –

+0

Su problema no implica el almacenamiento en caché del navegador. Por alguna razón, Express está enviando un 304 en lugar de una redirección real, y el navegador está respondiendo adecuadamente (es decir, manteniendo la versión anterior). Suena como un tipo de almacenamiento en caché interno hecho por Express; ¿Está usted por casualidad usando express.static para servir la página en cuestión? – ebohlman

Respuesta

10

Me gustaría comentar, pero acabo de unirme hoy y no tengo ningún punto de reputación.

Si lo entiendo correctamente, está publicando la página usando express.static (así que es solo una página HTML simple) pero si el usuario está registrado, usa el enrutador de express, ¿estoy en lo correcto?

También estoy adivinando que coloque el código mencionado para establecer los encabezados en la ruta de la página de inicio.

Si ese es el caso, su problema no es el almacenamiento en caché del navegador, se produce debido a la naturaleza de middleware connect.

Middlewares se ejecutan en una cadena, llamando a la siguiente cuando terminen, lo que significa que, si asumí correctamente, se usa express.static antes de su enrutador y simplemente sirve la página HTML estática.

Entonces su ruta nunca se ejecuta porque express.static no llamará al next() (por una razón obvia, el archivo existe).

Espero que haya dado en el clavo.


Editar:

Parece que asumí mal. Dijiste que funciona bien en su computadora portátil, así que definitivamente parece un problema de caché del lado del cliente.

Todavía no estoy seguro de cómo mostrar exactamente una página de inicio diferente usando express.static() o donde coloca el código que mencionó anteriormente, voy a probarlo sin ver su código, pero puede ser necesario para mí y para otros para ayudarte.

Esos encabezados de respuesta deben establecerse en la primera respuesta (cuando visita la página de inicio), no tiene nada que ver con la redirección. Vamos a dejar de lado la parte de redireccionamiento, por ahora.

me escribió un (expresar) ejemplo rápido:

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

Este código indica mi navegador no hagan caché de la página.

Las cabeceras de respuesta que obtienen sin la 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 

Las cabeceras de respuesta consigo 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 

Así como se puede ver, funciona pero podrías ejecutar este código tú mismo.

Si desea ejecutarlo, necesitará tener express en node_modules o instalarlo globalmente (con la bandera -g).

+0

Gracias por la respuesta/comentario. En realidad, uso express.static para ambos casos. Cuando la página se carga (en lugar de simplemente tomarse de la caché), debe hacer una llamada a '/ issignedin /' a través de ajax, y basado en eso, javascript cargará el diseño de página apropiado. Aquí puede ver el sitio: http://184.73.213.206:8080/ –

+0

@Nathan Mi suposición era incorrecta. Soy bastante Asegúrese de que mi respuesta actualizada (con un ejemplo de trabajo) sería útil. Si aún no lo es, tal vez deba publicar algunas partes relevantes de su código (probablemente middlewares y rutas). – samitny

+0

Gracias por el gran ejemplo. Pensé que funcionaría. , pero obtengo la misma respuesta, incluso después de borrar la memoria caché de mi navegador y volver a intentarlo. Lo investigaré un poco más y luego publicaré mi código. Gracias de nuevo. –

Cuestiones relacionadas