2012-07-13 43 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

這些標題需要寫在你不想緩存的頁面上('/'),而不是你正在做重定向的頁面,對不對? – 2012-07-13 18:20:01

+0

正確。是的,可能是把他們放在錯誤的地方。去看看這個。 – 2012-07-13 18:22:53

+0

您的問題不涉及瀏覽器緩存。無論出於何種原因,Express都會發送一個304而不是實際的重定向,並且瀏覽器正在作出適當的響應(即保留舊版本)。這聽起來像是由Express完成的某種內部緩存;你有沒有可能使用express.static來爲相關頁面提供服務? – ebohlman 2012-07-13 21:44:51

回答

10

我會評論,但我今天剛加入,沒有任何聲望點。

如果我理解正確的話,你使用express.static(所以它只是一個普通的HTML頁面),但如果用戶登錄的,你用快遞的路由器服務的頁面,我是正確的?

我也猜你把提到的代碼來設置標題在網頁的路線。

如果是這樣的話,你的問題是不是瀏覽器的緩存,它的發生是由於的connect中間件的性質。

中間件執行鏈中,要求在下單時,他們就完成了,這意味着,如果我假設正確,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,並基於此,JavaScript將加載相應的頁面佈局。在這裏您可以看到該網站:http://184.73.213.206:8080/ – 2012-07-20 10:18:01

+0

@Nathan我的假設是不正確的。我很漂亮確定我的更新答案(有一個工作示例)會有幫助,如果還沒有,也許你應該發佈一些代碼的相關部分(可能是中間件和路由) – samitny 2012-07-20 20:01:47

+0

感謝你的好例子,我認爲它可以工作,但是即使清理了我的瀏覽器的緩存並再次嘗試之後,我也得到了相同的響應,我會再仔細研究一下,然後發佈我的代碼,謝謝 – 2012-07-20 21:34:03