我通过子域服务我的应用上的所有静态内容。
但是,我的快递应用程序仍在静态内容上设置会话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
答案 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
}
}));