Sails.js SailsJS处于生产模式,API路由给出禁止的错误

Sails.js SailsJS处于生产模式,API路由给出禁止的错误,sails.js,Sails.js,在sails web应用程序上工作一段时间 到目前为止,通过认真阅读、反复试验,克服了所有问题 最近,我们不得不在客户端的ec2免费试用版上安装该应用程序进行测试,在开发模式下,该应用程序运行良好 该应用程序位于nginx代理的后面,该代理监听80端口并重定向到 CORS和CSRF已启用,allowOrigins和OnlyLowOrigins设置为production.js和security.js以及sockets.js中的服务器IP、web域和本地主机 但当切换到生产模式时,所有API请求(G

在sails web应用程序上工作一段时间

到目前为止,通过认真阅读、反复试验,克服了所有问题

最近,我们不得不在客户端的ec2免费试用版上安装该应用程序进行测试,在开发模式下,该应用程序运行良好

该应用程序位于nginx代理的后面,该代理监听80端口并重定向到

CORS和CSRF已启用,allowOrigins和OnlyLowOrigins设置为production.js和security.js以及sockets.js中的服务器IP、web域和本地主机

但当切换到生产模式时,所有API请求(GET除外)都被禁止

我尝试了在谷歌上能找到的一切,它在生产上根本不起作用,但在开发上完全起作用

如果有人能分享这方面的一些信息,我们将不胜感激

编辑:

使用debug Dully运行应用程序时,显示了以下内容:

允许套接字连接,但无法加载会话。正在创建一个空的一次性会话以用于此套接字连接的生命周期。 此日志经常出现,因为来自上一个lift或另一个Sails应用程序的客户端套接字正在尝试重新连接(例如,从打开的浏览器选项卡),但其cookie指示的会话不再存在——因为此应用程序当前未使用像Redis这样的持久会话存储,或者会话条目已从会话存储中删除(例如,通过计划作业或由于其自然过期)。 细节: 错误:无法加载会话。 立即启动。_onImmediate(/var/www/allscubashops.com/node_modules/sails/lib/hooks/session/index.js:543:42)在processImmediate(internal/timers.js:445:19)启动

然后,我删除了旧的浏览器cookie,并得到以下结果:

无法获取会话,因为连接套接字的握手中没有cookie。 生成一次性使用cookie: sails.sid=s%3APlHbdXvOZRo5yNlKPdFKkaPgVTNaNN8i.DwZzwHPhb1%2Fs9Am49lRxRTFjRqUzGO8UN90uC7rlLHs 并将其保存在套接字握手中

这意味着套接字以一个空会话开始,即(req.session=={}) 该“匿名”会话将仅持续到套接字断开连接。为了解决这个问题, 确保套接字在最初连接时发送
cookie
头或查询参数。 (这通常是由于使用非浏览器客户端,如本机iOS/Android应用程序, React Native、Node.js脚本或其他连接的设备。当 正在尝试在浏览器中连接跨源套接字,特别是对于Safari用户。 要解决此问题,请手动提供cookie,或者忽略此消息并使用 会话以外的方法(例如身份验证令牌)

也没有设置新的cookie

显而易见的结论是,在生产模式下,设置会话有点问题

编辑2:

最新的发现是,如果我在没有nginx代理的情况下运行应用程序,我不会出现禁用API请求的问题,但我仍然会遇到与未创建会话相关的问题

我确信nginx代理设置是可以的,但现在我正在考虑实现redis方式来存储会话,而不是默认的内存方式,看看会发生什么

编辑3:

我已经实现了Redis会话,它既适用于开发模式,也适用于产品模式

同样的情况,没有nginx代理的ec2实例在生产模式下工作,而带有nginx代理的ec2实例上的相同文件(git复制)在生产模式下不工作(API请求403禁止),但在开发模式下工作得非常好

X-CSRF令牌已发送, 我在生产过程中收到的sails错误消息(除了get之外的所有请求的网络403禁止错误)是:

允许套接字连接,但无法加载会话。正在创建一个空的一次性会话以用于此套接字连接的生命周期。 此日志经常出现,因为来自上一个lift或另一个Sails应用程序的客户端套接字正在尝试重新连接(例如,从打开的浏览器选项卡),但其cookie指示的会话不再存在——因为此应用程序当前未使用像Redis这样的持久会话存储,或者会话条目已从会话存储中删除(例如,通过计划作业或由于其自然过期)。 细节: 错误:无法加载会话。 在/var/www/example.com/node_modules/sails/lib/hooks/session/index.js:543:42 在Command.callback(/var/www/example.com/node_modules/@sailshq/connect redis/lib/connect redis.js:148:25) 在正常回复时(/var/www/example.com/node\u modules/machinepack redis/node\u modules/redis/index.js:714:21) 在RedisClient.return\u reply(/var/www/example.com/node\u modules/machinepack redis/node\u modules/redis/index.js:816:9) 在JavascriptRedisParser.returnReply(/var/www/example.com/node_modules/machinepack redis/node_modules/redis/index.js:188:18) 在JavascriptRedisParser.execute(/var/www/example.com/node_modules/redis parser/lib/parser.js:574:12) 在插座上。(/var/www/example.com/node_modules/machineepack redis/node_modules/redis/index.js:267:27) 在Socket.emit(events.js:193:13) 在addChunk(_stream_readable.js:296:12) 在readableAddChunk(_stream_readable.js:277:11) 在Socket.Readable.push(_stream_Readable.js:232:10) 在TCP.onStreamRead(internal/stream_base_commons.js:150:17)

因此,我假设套接字已连接,但未创建会话


Redis工作正常,我在开发中看到了会话。

您是否公开了csrf端点,并且在发出进一步请求之前,是否先调用该端点以获取令牌?这给了我一次提示。

EDIT:nginx也可以使用SSL监听,让我们加密证书,webapp在HTTPS上运行。好的,除了GET之外,我无法访问我的API路由,嘿,wouter,谢谢你尝试