2012-05-28 39 views
2

我通過子域爲我的應用程序提供所有靜態內容。expressjs從子域中刪除Cookie

但是,我的快車應用程序仍然在靜態內容上設置會話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的任何想法?

UPDATE:

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

當您設置域'.yourdomain.com',你指示瀏覽器使用此cookie用於任何**子域。您可能只想將其設置爲www.yourdomain.com。 –

+0

如何粘貼更多的配置?子域的邏輯與主站點的邏輯相同嗎? (有一個應用程序檢查域或..?) – alessioalex

+0

@alessioalex只有一個應用程序生活在www.yourdomain.com。子域是cdn.yourdomain.com。我在我的靜態內容的請求 - 響應頭文件中看到cookie,這些內容是從cdn.yourdomain.com – Rajat

回答

0

的連接會話中間件以這種方式工作。無論當前的主機如何,都設置Cookie。從性能角度來看,這是很好的,但是固有地導致這樣的問題。

我看到這個問題的兩個解決方案:

  • 使用Connect's Vhost中間件。海事組織,這是最直接的解決方案。只需爲cdn.yourdomain.com創建一個單獨的應用程序,但不包括會話中間件。

  • 在會話中間件周圍創建一個包裝,以便僅包含具有正確主機的請求。這是一個非常奇怪的解決方案,可能會干擾像CSRF這樣的其他中間件。

無論如何,我會說使用Node.js來提供靜態資產可能看起來像一個奇怪的想法。爲此,Nginx等網絡服務器在性能和亮度方面無與倫比。理想情況下,請求靜態請求應該不會達到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 
    } 
}));