NodeJS - 只有 OPTIONS 请求被发送到 REST API,POST 或 GET 不跟随(Cloudflare)
Posted
技术标签:
【中文标题】NodeJS - 只有 OPTIONS 请求被发送到 REST API,POST 或 GET 不跟随(Cloudflare)【英文标题】:NodeJS - only OPTIONS request is send to the REST API, POST or GET doesn't follow (Cloudflare) 【发布时间】:2019-02-01 17:16:13 【问题描述】:当我的网站调用 REST api(下面的代码)时,只有 OPTIONS
请求通过,POST
或 GET
请求不会跟随。 OPTIONS
请求成功通过 CORS 白名单。 POST
或 GET
请求没有被记录,它也没有被白名单阻止。奇怪的是,谷歌 Recaptcha 请求有效,所有第三个网站都有效,除了我的网站。该 api 与网站在同一个域上运行,只是另一个端口。
我的网站正在使用 Cloudflare,Cloudflare 不断更改传入请求的 IP 地址。我的网站通过 cloudflare 代理后,他的 IP 地址是 ipv6。网站他的ip被列为白名单数组中的ipv6地址。
const whitelist = ["*all the ip addresses"];
var corsOptions =
origin: (origin, callback) =>
if (whitelist.indexOf(origin) !== -1)
callback(null, true)
else
callback('Not allowed by CORS');
;
const app = express();
mongoose.connect(*mongodb credentials*);
app.use((req, res, next) =>
req.headers.origin = req.headers['cf-connecting-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress;
next();
);
app.use(morgan('combined'));
app.use(cors(corsOptions));
app.use(bodyParser.json(type: '*/*', limit: '2mb'));
app.use(bodyParser.urlencoded(limit: '2mb', extended: true));
app.use(*routing*);
module.exports = app;
【问题讨论】:
【参考方案1】:app.use 仅用于注册中间件。 您需要为您使用的每种方法指定一个路由。 app.get、app.put、app.delete 等。 您还可以将 app.all 用于所有方法 你可以在这里找到更多信息:https://expressjs.com/en/guide/routing.html
【讨论】:
其实你可以使用app.use()
来做到这一点。看起来像这样app.use('/api/articles, articleRoutes
。 articleRoutes
指向所有路线。如果我注释掉 cors 配置,那么一切正常。除了IP白名单不起作用。以上是关于NodeJS - 只有 OPTIONS 请求被发送到 REST API,POST 或 GET 不跟随(Cloudflare)的主要内容,如果未能解决你的问题,请参考以下文章