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 请求通过,POSTGET 请求不会跟随。 OPTIONS 请求成功通过 CORS 白名单。 POSTGET 请求没有被记录,它也没有被白名单阻止。奇怪的是,谷歌 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, articleRoutesarticleRoutes 指向所有路线。如果我注释掉 cors 配置,那么一切正常。除了IP白名单不起作用。

以上是关于NodeJS - 只有 OPTIONS 请求被发送到 REST API,POST 或 GET 不跟随(Cloudflare)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Fetch API 将第一个 PUT 请求作为 OPTIONS 发送

(转)HTTP的请求方法OPTIONS

Nodejs 请求转发代理

如何从 Nodejs 服务器启用 CORS

mongoDB 和 nodeJs 无法正确处理并发请求

options请求问题