ReactJS Axios Nginx CORS 问题
我正在使用
React 15.6.1、Axios、NGINX
。我在登录时遇到 CORS 问题。以下是登录 axios
POST
调用
const additionalHeaders = {
code: action.payload,
page: 'login'
};
const loginData = yield call(() =>
axios(authorization, 'Basic', additionalHeaders).post(
URL + ACCESS_TOKEN_URL,
params
)
);
以下是错误控制台
Access to XMLHttpRequest at '..../oauth/token' from origin 'http://localhost:3000'
has been blocked by CORS policy: Request header field sourcepage is not allowed by
Access-Control-Allow-Headers in preflight response.
utils.js:258 uncaught at tryLogin
at takeLatestHelper
at login
TypeError: Cannot read property 'data' of undefined
at login$ (webpack-internal:///./app/containers/Login/saga.js:137:43)
at tryCatch (webpack:///./node_modules/regenerator-runtime/runtime.js?:65:40)
at Generator.invoke [as _invoke] (webpack:///./node_modules/regenerator-runtime/runtime.js?:303:22)
at Generator.prototype.<computed> [as throw] (webpack:///./node_modules/regenerator-runtime/runtime.js?:117:21)
at next (webpack:///./node_modules/redux-saga/es/internal/proc.js?:289:32)
at currCb (webpack:///./node_modules/redux-saga/es/internal/proc.js?:387:7)
at eval (webpack:///./node_modules/redux-saga/es/internal/proc.js?:443:14)
..
..
xhr.js:160 POST .../aas/oauth/token net::ERR_FAILED
以下是我尝试过的,但没有用。
我有 NGINX 配置。我已为
Access-Control-Allow-Origin
添加了
add_header
参数
# Always serve index.html for any request
location / {
add_header 'Access-Control-Allow-Origin' "*";
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, PATCH, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With';
# Set path
root /var/www/;
try_files $uri /index.html;
}
并且我们有 3 个 nodejs middleWare 文件
frontendMiddleWare.js
、
devMiddleware.js
、
prodMiddleWare.js
,我已在
fontendMiddleware
中添加了以下访问权限
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
next();
});
我在客户端找不到更多解决方案,仍然无法解决问题。
编辑:此问题第二次出现。我第一次能够看到具有 200 响应的令牌并且可以正常工作。当我尝试登录时加载应用程序时,它将再次尝试获取令牌。此时 CORS 问题出现了。
我们可以在 package.json 文件中创建一个代理,如果前端没有路由,它将调用后端服务器。我们可以在 package.json 中添加一个名为 proxy 的键,并将后端 api 作为值
proxy: http://localhost:PORT_NUMBER_OF_BACKEND
Remember to stop the react server and start it again for this to work
来源 https://create-react-app.dev/docs/proxying-api-requests-in-development/
在这种情况下,我们不会出现 cors 错误,在生产中,我们可以生成构建并将其放在网站后端的公共文件夹中,因此生产中不会出现任何 cors 问题。
您可以在应用程序中添加 cors 包,首先您应该安装 cors 包
npm install cors --save
,然后执行以下操作:
const cors = require('cors');
app.use(cors());
删除您在 Nginx conf 和中间件文件上放置的所有其他额外标头。
希望它能起作用
您可以使用 fruitcake/laravel-cors 包来引发异常并修复 api 路由。