expressjs从子域删除cookie

时间:2012-05-28 07:56:46

标签: node.js express session-cookies connect

我通过子域服务我的应用上的所有静态内容。

但是,我的快递应用程序仍在静态内容上设置会话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

1 个答案:

答案 0 :(得分:0)

连接会话中间件以这种方式工作。无论当前主机如何,都会设置Cookie。从性能的角度来看,这很好,但本质上会导致这样的问题。

我认为这个问题有两个解决方案:

  • 使用Connect's Vhost中间件。 IMO,这是最直接的解决方案。只需为cdn.yourdomain.com创建一个单独的应用程序,而不包括会话中间件。

  • 围绕会话中间件创建一个包装器,以便仅包含具有正确主机的请求。这是一个非常奇怪的解决方案,可能会干扰像CSRF这样的其他中间件。

无论如何,我会说使用Node.js来提供静态资产可能看起来很奇怪。为此,像Nginx这样的Web服务器在性能和轻量级方面是无与伦比的。理想情况下,静态请求的请求甚至不应达到Node.js。

-

仅供参考,第二个解决方案的代码可能看起来像那样(未经测试):

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