expressjs 从子域中删除 cookie

问题描述 投票:0回答:1

我通过子域在我的应用程序上提供所有静态内容。

但是,我的 Express 应用程序仍在静态内容上设置会话 Cookie。我尝试按照文档设置这样的路径:

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

但它对我来说仍然不起作用。我也尝试过使用“路径”:

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
node.js express session-cookies node.js-connect
1个回答
0
投票

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

我看到这个问题有两种解决方案:

  • 使用Connect 的 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
  }
}));
© www.soinside.com 2019 - 2024. All rights reserved.