2012-07-13 2 views
9

저는 node.js, Express 및 모바일 개발이 처음인데 Express와 함께 헤더를 보내는 것과 관련된 문제가 발생했습니다.node.js/Express를 사용하여 리다이렉트로 설정하지 않은 헤더

사용자는 로그인하지 않은 홈 페이지 '/'에서 시작한 다음 버튼을 클릭하여 로그인 페이지로 이동합니다. 그들은 '/ validate_signin'에 자신의 아이디와 비밀번호를 입력 할 때, 그들은 그들이에 기록되기 때문에 홈 페이지를 다르게 보여주는, 다시 홈 페이지에이 시간을 리디렉션 할

리디렉션은 다음과 같이 일했다.

res.redirect('/'); 

내 노트북에서는 정상적으로 작동하지만 휴대 전화에서는 캐싱으로 인해 이전 상태 인 '/'로 리디렉션됩니다. 휴대 전화에서 페이지를 새로 고침하면 '/'이 표시됩니다. How to control web page caching, across all browsers?

는 다음과 같은 두 가지 방법으로 (별도)에 헤더를 설정하려했지만, 그들은 보낼하지 않는 것 : 여기

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

는 헤더이다

는이 게시물을 발견 현재 받고있는 메시지 :

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 

아이디어가 있으십니까?

감사합니다.

+1

이러한 헤더는 리디렉션을 수행하는 페이지가 아닌 캐시하지 않을 페이지 ('/')에 작성해야합니다. 맞습니까? –

+0

수정하십시오. 그래, 아마도 그들을 잘못된 장소에 세우고있을거야. 이것을 들여다 보게됩니다. –

+0

문제는 브라우저 캐싱을 포함하지 않습니다. 어떤 이유로 든 Express는 실제 리디렉션이 아닌 304를 보내고 브라우저가 적절히 응답하고 있습니다 (예 : 이전 버전 유지). 익스프레스가 수행하는 일종의 내부 캐싱 인 것 같습니다. Express.static을 사용하여 문제의 페이지를 제공 할 수 있습니까? – ebohlman

답변

10

나는 의견을 말하고 싶지만 나는 지금 막 참가하여 명성을 얻지 못했다.

올바르게 이해하면 express.static을 사용하여 페이지를 제공하고 있습니다 (일반 HTML 페이지이기 때문에). 사용자가 로그인 한 경우 익스프레스 라우터를 사용하고 있습니까? 맞습니까?

홈페이지의 경로에 헤더를 설정하는 데 언급 된 코드를 넣는 것으로 추측됩니다.

그런 경우라면 브라우저 캐싱이 아닌 connect 미들웨어의 특성으로 인해 문제가 발생합니다.

Middlewares는 실행이 끝났을 때 다음 명령을 호출합니다. 즉, 올바르게 가정하면 express.static이 라우터 이전에 호출되어 정적 HTML 페이지를 제공합니다.

express.static가 next()을 호출하지 않으므로 경로가 실행되지 않습니다. 명백한 이유로 파일이 존재합니다.

희망이 있다고 생각합니다.


편집 : 내가 잘못 가정처럼

보인다. 랩톱에서 잘 작동한다고해서 클라이언트 측 캐싱 문제와 같은 것처럼 보입니다.

express.static()을 사용하여 다른 홈페이지를 표시하는 방법이나 위에 언급 한 코드를 배치하는 방법을 모르겠지만 코드를 보지 않고도 사진을 찍을 수는 있습니다. 당신을 돕기 위해 나와 다른 사람들에게 필요했습니다.

첫 번째 응답에서 응답 헤더를 설정해야합니다 (사용자가 홈페이지를 방문했을 때). 응답 헤더는 리디렉션과 관련이 없습니다. 이제는 리디렉션 부분을 제외 시키십시오.

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

이 코드는 페이지를 캐시하지 않는 브라우저를 지시합니다

나는 빠른 (표현) 예제를 썼다. 내가 noCachePlease 미들웨어 을 얻을

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 

응답 헤더 :

응답 헤더 내가없이 noCachePlease 미들웨어 를 얻을 당신이 볼 수 그래서

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 

를, 그것은 작동 하지만이 코드는 직접 실행할 수 있습니다.

실행하려면 expressnode_modules 아래에 두거나 전체적으로 (-g 플래그와 함께) 설치해야합니다.

+0

답변/의견 주셔서 감사합니다. 사실, 나는 두 경우 모두 express.static 사용합니다. 그냥 캐시에서 가져 오는 것보다 페이지를로드 할 때 호출해야합니다 '/ issignedin /'ajax를 통해, 그리고 자바 스크립트를 적절한 페이지 레이아웃을로드합니다. 여기에 사이트를 볼 수 있습니다 : http://184.73.213.206:8080/ –

+0

@ Nathan 제 가정은 틀렸어. 업데이트 된 답변 (실제 예제 사용)이 도움이 될 것입니다. 여전히 그렇지 않으면 어쩌면 코드의 관련 부분 (미들웨어 및 경로)을 게시해야합니다. – samitny

+0

훌륭한 예를 들어 주셔서 감사합니다. 하지만 브라우저의 캐시를 지우고 다시 시도한 후에도 동일한 응답이 표시됩니다.이 코드를 조금 더 살펴본 다음 코드를 게시하겠습니다. 다시 한 번 감사드립니다. –