Express:cors 配置是不是依赖于服务器 TTL?
Posted
技术标签:
【中文标题】Express:cors 配置是不是依赖于服务器 TTL?【英文标题】:Express: does cors configuration depend on server TTL?Express:cors 配置是否依赖于服务器 TTL? 【发布时间】:2020-07-24 00:38:59 【问题描述】:我已成功将我的 Express API 应用程序部署到 AWS 弹性 beanstalk。我有一个托管在 S3 上的 React 前端。
两者都在同一个域中,前端位于 example.com,API 位于 api.example.com 两者都有证书并受到保护。
const express = require('express');
const cors = require('cors')(
Origin: 'https://example.com'
);
// followed by required middleware
app.use(cors());
//followed by app constants
app.use((e, req, res, next) =>
res.header("Access-Control-Allow-Origin", "https://example.com");
res.header('Access-Control-Allow-Methods', 'DELETE, PUT, GET, POST');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
if (e)
console.log(e);
res.status(500).send(e.message);
next();
)
// followed by app routes
当我尝试在我的网站上注册用户时,我收到错误消息:
Access to XMLHttpRequest at 'https://api.example.com/users/signup/' from origin 'https://example.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
这个话题当然已经在 Stack Overflow 上讨论过多次(我今天早上已经通过了多种解决方案),但我的问题与托管 API 的实际服务器有关。
在 api.example.com 的托管区域中,它的 TTL 为 172800(48 小时)。这是否意味着我的更改不会在那个时候反映出来?如果是这样,这是否意味着每次部署代码时都会重置 TTL?
我是一名前端开发人员,从事一个业余项目,所以这真的不是我的专业领域。任何 DevOps 或后端开发人员有什么想法吗?提前致谢!
【问题讨论】:
您查看过注册请求的响应标头吗?响应中是否有 CORS 标头?通常,检查 DevTools 中的标头以了解在解决问题期间要挖掘的位置非常有帮助。 【参考方案1】:在 api.example.com 的托管区域中,它的 TTL 为 172800(48 小时)。这是否意味着我的更改不会在那个时候反映出来?如果是这样,这是否意味着每次部署代码时都会重置 TTL?
没有。
TTL 是预计其他 DNS 服务器缓存 DNS 信息的时间(例如,域名指向哪个服务器)。
与代码部署无关。
您的问题与此无关。我会在服务器端代码中添加一些日志记录,以查看实际命中了哪些路由和中间件,并监控您在浏览器的“网络”选项卡中获得的精确请求和响应。
【讨论】:
感谢您的回复。我会再给我的代码一次,看看我做错了什么。我注意到您对下面关于飞行前的帖子的评论,所以我现在有一个可以查看的方向。【参考方案2】:浏览器可以针对特定类型的跨域请求发出preflight OPTIONS
请求。如果对该请求的响应不成功或没有 CORS 标头,您也会收到此类错误。
所以我想你应该在你的 Express 应用程序中添加一个路由来处理预检请求并发送回相同的 CORS 标头,或者只使用express-cors-middleware。
【讨论】:
错误提示“在请求的资源上”。如果是预检问题,则错误消息将提及预检。以上是关于Express:cors 配置是不是依赖于服务器 TTL?的主要内容,如果未能解决你的问题,请参考以下文章