CORS не работает должным образом для домена и субдомена.
У меня есть один сервер NodeJS, размещенный на https://api.example.com
У меня два клиента ReactJS
Клиент 1. https://example.com
Клиент 2. https://subdomain.example.com
Я настроил Клиента 1 на принудительное использование www, чтобы для Клиента 1 использовался один источник
Когда я открываю Clien1, это прекрасно работает.
Когда я открываю Client2, я получаю сообщение об ошибке
Доступ к XMLHttpRequest по адресу https://api.example.com/someAPI' от источника 'https://subdomain.example.com' заблокирован политикой CORS: заголовок' Access-Control-Allow-Origin 'имеет значение' https://www.example.com' не равный указанному источнику
Когда я нажимаю Ctrl + F5, тогда он работает нормально, но после этого, если я обновляю Client1, то появляется ошибка Client1
Доступ к XMLHttpRequest в 'https://api.example.com/someAPI' от источника' https://www.example.com' заблокирован политикой CORS: заголовок 'Access-Control-Allow-Origin' имеет значение 'https://subdomain.example.com' это не равно указанному источнику.
Теперь, когда я нажимаю Ctrl + F5 на Client1, он работает нормально, но та же самая ошибка идет на Client2.
Мой сервер nodeJS настроен следующим образом
var whitelist = ['https://www.example.com', 'https://subdomain.example.com'];
getCorsCoptions(req, callback) {
var getOriginValue = () => {
if (whitelist.indexOf(req.header('origin')) !== -1) {
return true;
} else {
log.error(__filename, 'Not allowed by CORS', origin);
return false;
}
}
var corsOptions = {
origin: getOriginValue(),
methods: ['GET', 'POST'],
credentials: true,
preflightContinue: false,,
allowedHeaders:["Content-Type","X-Requested-With","X-HTTP-Method-Override","Accept"]
}
callback(null, corsOptions)
}
app.use('*', cors(this.getCorsCoptions));
app.options('*', cors(this.getCorsCoptions));
Я использую axios на сторонах React Client следующим образом
get(url: string) {
return Axios.get(url, {
withCredentials: true
}).then((res: any) => {
if (res) {
return res.data;
}
return {};
});
}
post(url: string, data: any) {
let requestHeaders = { 'Content-Type': 'application/json' };
return Axios.post(url, data, {
headers: requestHeaders
, withCredentials: true
}).then((res: any) => {
if (res) {
return res.data;
}
return {};
});
}