2

サブドメインを介してアプリのすべての静的コンテンツを提供しています。

ただし、私のエクスプレスアプリはまだ静的コンテンツにセッションCookieを設定しています。ドキュメントに従って、次のようにパスを設定してみました。

app.use(express.session({
    secret: 'your app secret',
    cookie: {
        domain : '.yourdomain.com'
    },
    store: new MongoStore({
        db: 'db',
        host: 'localhost',
        port:config.dbPort
    })
}));

しかし、それでも私にはうまくいきません。'path'も使ってみました:

cookie: {
   path : '.yourdomain.com'
}

しかし、それでも静的コンテンツへのCookieの設定を妨げることはありません。

すべての静的コンテンツからCookieを削除する方法に関するアイデアはありますか?

アップデート:

Request Headers
    Accept:text/css,*/*;q=0.1
    Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
    Accept-Encoding:gzip,deflate,sdch
    Accept-Language:en-US,en;q=0.8
    Connection:keep-alive
    Host:cdn.yourdomain.com
    Referer:http://localhost:8888/
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5

Response Headers
    Cache-Control:public, max-age=86400
    Connection:keep-alive
    Content-Encoding:gzip
    Content-Type:text/css; charset=UTF-8
    Date:Mon, 28 May 2012 09:02:09 GMT
    Last-Modified:Tue, 01 May 2012 03:57:45 GMT
    Server:nginx
    Set-Cookie:connect.sid=d9nEPGiAeSwGFUN2Ra8CGBmq.tPdTQdk7O2UUvO2q%2BEOG2%2Fgh%2FNEdIxtUZYdUN%2FtDmas; domain=www.yourdomain.com; path=/; expires=Mon, 28 May 2012 13:02:08 GMT; httpOnly
    Transfer-Encoding:chunked
    X-Cache:MISS
    X-Edge-Id:353260802
4

1 に答える 1

0

接続セッション ミドルウェアはこのように動作します。Cookie は、現在のホストに関係なく設定されます。これはパフォーマンスの観点からは良いことですが、本質的にこのような問題を引き起こします。

この問題には 2 つの解決策があります。

  • Connect の Vhostミドルウェアを使用します。IMO、これは最も簡単な解決策です。cdn.yourdomain.comセッションミドルウェアを含めずに、別のアプリを作成するだけです。

  • 正しいホストのリクエストに対してのみ含めるために、セッション ミドルウェアのラッパーを作成します。これはかなり奇妙な解決策であり、CSRF などの他のミドルウェアを妨害する可能性があります。

とにかく、Node.js を使用して静的アセットを提供するというのは、奇妙に思えるかもしれません。このため、Nginx のような Web サーバーは、パフォーマンスと軽さの点で無敵です。静的リクエストのリクエストは、理想的には Node.js に到達しないようにする必要があります。

--

参考までに、2 番目のソリューションのコードは次のようになります (未テスト)。

function hostAwareSessionMiddleware(options) {
  var originalMiddleware = express.session(options);
  if(!options.cookie || !options.cookie.domain) return originalMiddleware;
  var domain = options.cookie.domain;
  if(domain[0] === '.') domain = '(.+)\.' + domain.slice(1);
  var regex = new RegExp('^' + domain.replace('.', '\\.') + '$', 'i');
  return function(req, res, next) {
    if(!req.headers.host) return next();
    if(req.headers.host.match(regex)) {
      return originalMiddleware(req, res, next);
    }
    next();
  }
}

app.use(hostAwareSessionMiddleware({
  secret: 'your app secret',
  cookie: {
    domain : 'yourdomain.com'
  },
  store: new MongoStore({
    db: 'db',
    host: 'localhost',
    port:config.dbPort
  }
}));
于 2012-05-28T22:28:14.603 に答える