Node.js expressjs从子域中删除cookie

Node.js expressjs从子域中删除cookie,node.js,express,session-cookies,connect,Node.js,Express,Session Cookies,Connect,我正在通过子域为我的应用程序上的所有静态内容提供服务 但是,我的express应用程序仍在静态内容上设置会话cookie。我试着按照以下文档设置路径: app.use(express.session({ secret: 'your app secret', cookie: { domain : '.yourdomain.com' }, store: new MongoStore({ db: 'db', host: '

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

但是,我的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的想法

更新:


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

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

使用中间件。在国际海事组织,这是最直接的解决办法。只需为cdn.yourdomain.com创建一个单独的应用程序,而不包括它的会话中间件

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

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

-

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

函数hostAwareSessionMiddlewareoptions{ var originalMiddleware=express.sessionoptions; if!options.cookie | |!options.cookie.domain返回originalMiddleware; var domain=options.cookie.domain; ifdomain[0]=='.'domain='.+\.+domain.1; var regex=new RegExp'^'+domain.replace'.','\\.+'$','i'; 返回函数REQ、res、next{ 如果!req.headers.host返回下一步; ifreq.headers.host.matchregex{ 返回originalMiddlewarereq,res,next; } 下一个 } } app.usehostAwareSessionMiddleware{ 机密:“你的应用程序机密”, 曲奇:{ 域名:“yourdomain.com” }, 商店:新蒙哥斯托尔{ db:'db', 主机:“localhost”, 端口:config.dbPort } };
连接会话中间件就是这样工作的。Cookie的设置与当前主机无关。从性能的角度来看,这是好的,但本质上会导致这样的问题

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

使用中间件。在国际海事组织,这是最直接的解决办法。只需为cdn.yourdomain.com创建一个单独的应用程序,而不包括它的会话中间件

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

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

-

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

函数hostAwareSessionMiddlewareoptions{ var originalMiddleware=express.sessionoptions; if!options.cookie | |!options.cookie.domain返回originalMiddleware; var domain=options.cookie.domain; ifdomain[0]=='.'domain='.+\.+domain.1; var regex=new RegExp'^'+domain.replace'.','\\.+'$','i'; 返回函数REQ、res、next{ 如果!req.headers.host返回下一步; ifreq.headers.host.matchregex{ 返回originalMiddlewarereq,res,next; } 下一个 } } app.usehostAwareSessionMiddleware{ 机密:“你的应用程序机密”, 曲奇:{ 域名:“yourdomain.com” }, 商店:新蒙哥斯托尔{ db:'db', 主机:“localhost”, 端口:config.dbPort } };
当您将域设置为.yourdomain.com时,您正在指示浏览器将此cookie用于任何子域。您可能只想将其设置为www.yourdomain.com。粘贴更多配置如何?子域的逻辑是否与主站点的逻辑相同?是否有1个应用程序检查域或..?@alessioalex只有一个应用程序位于www.yourdomain.com。子域是cdn.yourdomain.com。我在请求-响应头中看到来自cdn.yourdomain的静态内容的cookie。com@zi42我试过了,但不起作用。当您将域设置为.yourdomain.com时,您正在指示浏览器对任何子域使用此cookie。您可能只想将其设置为www.yourdomain.com。粘贴更多配置如何?子域的逻辑是否与主站点的逻辑相同?是否有1个应用程序检查域或..?@alessioalex只有一个应用程序位于www.yourdomain.com。子域是cdn.yourdomain.com。我在请求-响应头中看到来自cdn.yourdomain的静态内容的cookie。com@zi42我试过了,但没用。
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