我有一个单节点服务器,它响应请求并根据主机标头重定向用户。用法是静态/主站点位于 www 并且每个用户都有自己的子域(即 www.example.com 和 site.example.com)。路由是根据 site.js。
当用户未登录时,他们将被重定向到登录。
我发现当用户被重定向到他们的子域时,会话没有被维护。我想这是意料之中的,但我想知道是否有办法在两个子域之间保持相同的会话。
我希望如果他们登录并返回 www.example.com,他们会看到一个不同的视图,其中包括一个指向注销/他们的仪表板等的链接。我目前的解决方法是,我在想,只是创建他们子域上的会话,如果他们确实返回 www,就好像他们没有登录一样。
之前有人处理过这个问题,或者对如何以这种方式处理会话有答案吗?
我认为问题可能出在 users.js 中,我重定向到“http://site.example.com”,因为它不是相对路径...
这是相关代码(用户查找是使用 MongoDB 完成的,我将其忽略为工作正常 - 调用此服务的行是 users.authenticate)...
server.js:
app.configure ->
app.set "views", "#{__dirname}/views"
app.set "view engine", "jade"
app.use express.bodyParser()
app.use express.methodOverride()
app.use express.cookieParser()
app.use express.session {
key: "KEY",
secret: "SECRET",
store: new MemoryStore(),
cookie: {
domain: 'example.com',
maxAge : 1000*60*60*24*30*12
}
}
app.use express.static "#{__dirname}/public"
app.use express.logger "short"
app.use express.favicon "#{__dirname}/public/img/favicon.ico"
app.use app.router
网站.js:
module.exports = (app) ->
app.get '/', (req, res) ->
console.log "/ hit with #{req.url} from #{req.headers.host}"
domains = req.headers.host.split "."
org = if domains then domains[0] else "www"
if org == "www"
res.render "index", { layout: null }
else
if req.session.user
console.log "session established"
res.render "app", { layout: null }
else
console.log "no session"
res.redirect "http://www.example.com/accounts/login"
用户.js:
users = require('../services/users')
module.exports = (app) ->
app.get "/accounts/login", (req, res) ->
res.render "login", { layout: null, locals: { returnUrl: req.query.returnUrl } }
app.post "/accounts", (req, res) ->
users.authenticate app, req.body.login, req.body.password, (user) ->
if user
req.session.user = user
res.redirect "http://#{user.orgName}.example.com"
else
res.render "login", { layout: null, locals: { returnUrl: req.body.url } }
app.get "/accounts/logout", (req, res) ->
console.log "deleting user from session"
delete req.session.user
res.redirect "http://www.example.com
为了在 OSX 上进行本地测试,我将 www.example.com 和 site.example.com 添加到我的 hosts 文件中,以便在本地处理 DNS 查找。