2012-07-13 3 views
9

私はnode.js、Express、およびモバイル開発が比較的新しいので、Expressでヘッダーを送信することと関連していると思われる問題が発生しています。node.js/Expressを使用してリダイレクトで設定されていないヘッダー

ユーザはログインしていないホームページ「/」からログインし、ボタンをクリックしてサインインページに移動します。彼らは「/ validate_signin」に自分のユーザー名とパスワードを送信すると、彼らがログインしているので、彼らは異なっ現れてホーム・ページで、バックホームページにこの時間をリダイレクトする必要があります

リダイレクトは、このように働いた:。

res.redirect('/'); 

これは私のラップトップでは問題なく動作しますが、携帯電話では、キャッシュのために古い状態で '/'にリダイレクトされます。電話でページを更新すると、「/」が表示されます。

私はこの記事を見つけました: How to control web page caching, across all browsers?

は持っているが、次の2つの方法(別途)でヘッダーを設定しようとしましたが、彼らが送信されていないようです。ここで

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によって行われている内部キャッシュのようなものです。 Express.staticを使用して問題のページを提供していますか? – ebohlman

答えて

10

私はコメントしたいと思いますが、今日は参加して評判のポイントはありません。

express.staticを使用してページを提供しています(単純なHTMLページです)。ただし、ユーザーがサインインしている場合はExpressのルータを使用していますが、正しいですか?

ホームページのルートにヘッダーを設定するためのコードを記述していると思います。

この場合、問題はブラウザキャッシングではなく、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/ –

+0

@Nathan私の前提は間違っていました。私の更新された答え(実際の例で)が役立つでしょう。それでもそれがなければ、あなたのコードのいくつかの関連部分(たぶんミドルウェアとルート)を投稿するべきでしょうか? – samitny

+0

素晴らしい例をありがとう。しかし、私はブラウザのキャッシュをクリアしてもう一度やり直しても、同じ応答を得ています。もう少し調べてからコードを投稿してください。もう一度おねがいします。 –

関連する問題