9

私は node.js、Express、およびモバイル開発に比較的慣れていないため、Express でヘッダーを送信することに関係していると思われる問題に遭遇しました。

ユーザーは、ログインせずにホームページ「/」から開始し、ボタンをクリックしてサインイン ページに移動します。ユーザー名とパスワードを「/validate_signin」に送信すると、ホームページにリダイレクトされますが、今回はログインしているためホームページが異なって表示されます。

リダイレクトは次のように機能しました。

res.redirect('/');

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

この投稿を見つけました: すべてのブラウザーで Web ページのキャッシュを制御する方法は?

次の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

何か案は?

どうもありがとう。

4

1 に答える 1

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

ご覧のとおり、動作しますが、このコードを自分で実行することもできます。

実行したい場合は、グローバルに (フラグを付けて)express下に置くか、インストールする必要があります。node_modules-g

于 2012-07-20T03:05:36.653 に答える