首先有一点背景知识:我为我的nodejs api服务器使用restify框架,并为客户端与服务器交互使用react。我使用nginx反向代理在一个VPS中设置了两个项目,以使用两个不同的域名进行维护:example_server.com
,example_client.com
,并且都使用letEncrypted启用了https。
所以当我访问example_server.com
时,我的Nginx将我带到localhost:server_port并显示正确的内容,客户端的工作方式相同。
这是我的问题:
我连接到Restify服务器的React Client无法获得会话工作,该服务器无法为该客户机设置任何会话。它可能与nginx反向代理问题有关,有人为服务器使用快速框架存在相同的问题,但已使用app.set('trust proxy', 1)
进行了修复。但请再说一遍,没有这样的选择。我真的不想将我的代码从再验证更改为表达,所以我该怎么办?
我的服务器nginx设置:
server {
server_name server_example.com www.server_example.com;
location / {
proxy_pass http://127.0.0.1:6000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
我的客户端nginx设置:
server {
server_name client_example.com www.client_example.com;
location / {
proxy_pass http://127.0.0.1:7000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
我使用express-session
在我的Restify服务器中处理会话,在本地开发中运行良好,但是在具有Nginx的VPS服务器中,它无法正常工作。这是代码段:
var constant = require('./config/constant.json');
var session = require('express-session');
var restify = require('restify');
var corsMiddleware = require("restify-cors-middleware");
const cors = corsMiddleware({
origins: constant.client_urls,
credentials: true,
allowHeaders: ["Authorization"],
exposeHeaders: ["Authorization"]
});
var server = restify.createServer();
server.use(restify.plugins.queryParser());
server.use(restify.plugins.jsonp());
server.pre(restify.plugins.pre.userAgentConnection());
server.pre(cors.preflight);
server.use(cors.actual);
//server.set('trust proxy', 1); restify didn't has such option, err: .set is not a function.
server.use(session({
secret: constant.session_secret,
proxy: true,
resave: false,
saveUninitialized: true,
cookie: { maxAge: 3600000, secure: true },
}))
任何帮助将不胜感激!
原来问题是由两个不同的域引起的。
React客户端www.myReactClient.com
能够连接到启用了CORS的Restify API服务器www.myRestifyServer.com
,然后服务器将生成一个会话,并保留其自身,而仅通过cookie将会话ID发送给客户端。
React客户端应该携带该cookie并在每次向其发出请求时将会话ID发送回服务器,以便服务器识别该客户端。
但是,由于使用了两个不同的域,该cookie被视为“第三方cookie”,并且浏览器默认情况下会阻止这种cookie,因此该cookie保留在那里但从未被使用过,因此服务器将不会收到该cookie。会话ID。
所以,总而言之,当我将浏览器设置更改为NOT阻止第三方cookie后,一切都会按计划进行。然后,我将两个不同的域更改为带有一个子域的一个域,www.myReactClient.com
用于托管React Client,api.myReactClient.com
用于托管Restify API服务器,也解决了第三方Cookie问题。