【发布时间】:2018-09-09 10:12:37
【问题描述】:
这是我的问题:我有一个站点 exemple.com 和一个节点服务器,我的 API 在 exemple.com:3000 上运行。我希望我的 API 只能由 example.com 访问。
所以我认为如果我在响应中发送标题:Access-Control-Allow-Origin: https:exemple.com,那么同源策略会阻止来自除我之外的每个站点的所有请求。
问题是,如果我在另一个站点上调用 url:http://exemple.com:3000/api/v1/test/search,我会遇到错误:
无法加载https://exemple:3000/api/v1/test/search:“Access-Control-Allow-Origin”标头的值“https://exemple.com”不等于提供的来源。 Origin 'http://randomsite.com' 因此不允许访问。
但在网络选项卡中,我的响应是 200 状态和所有结果。
如何同时出现错误和结果?这是我的代码:
app.js
const corsApiOptions = {
origin: 'https://exemple.com',
originSuccessStatus: 200,
};
app.use('/api/v1', cors(corsApiOptions), api);
路由/api.js
const express = require('express'); const mongoose =
require('mongoose'); const mongoosastic = require('mongoosastic');
const AssoSchema = require('../schemas/assoSchema');
const router = express.Router();
router.post('/assos/search', (req, res) => { let { query } =
req.body; if (query && query.length > 0) {
query = query
.split(' ')
.map(el => `${el}~`)
.join(' ');
mongoose.connect('mongodb://localhost/mydb');
AssoSchema.plugin(mongoosastic);
const Asso = mongoose.model('asso', AssoSchema, 'assos');
Asso.search(
{
query_string: { query },
},
{ hydrate: true },
(err, results) => {
if (err) res.json({ error: err });
res.json(results.hits.hits);
},
); } else res.json(''); });
module.exports = router;
如果我从 randomsite.com 的控制台发出 ajax 请求,以下是结果
//General
Request URL: https://exemple.com:3000/api/v1/test/search
Request Method: POST
Status Code: 200 OK
Remote Address: X.X.X.X:3000
Referrer Policy: no-referrer-when-downgrade
//Response Headers
Access-Control-Allow-Origin: https://exemple.com
Connection: keep-alive
Content-Length: 10022
Content-Type: application/json; charset=utf-8
Date: Fri, 30 Mar 2018 10:52:25 GMT
ETag: W/"2726-3/3tY5WvDTtyKm4KPBifg2dP7mI"
Vary: Origin
X-Powered-By: Express
//Request Headers
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Content-Length: 21
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Host: exemple.com:3000
Origin: http://randomsite.com
Referer: http://random.site.com/
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
//Form Data
query: random search
在预览选项卡中,我可以在 json 中看到我所有的 10 个结果。
我希望我的 api 只能从 exemple.com 访问,有人可以帮助我吗?
【问题讨论】: