webpack 开发服务器 CORS 问题

IT技术 reactjs webpack cors webpack-dev-server superagent
2021-04-08 08:39:48

我正在webpack-dev-server v1.10.1用来提升我的 Redux 项目,我有以下选项:

contentBase: `http://${config.HOST}:${config.PORT}`,
quiet: false,
noInfo: true,
hot: true,
inline: true,
lazy: false,
publicPath: configWebpack.output.publicPath,
headers: {"Access-Control-Allow-Origin": "*"},
stats: {colors: true}

在 JS 中,我使用requestfromsuperagent生成 HTTP GET 调用

request
          .get(config.APIHost + apiUrl)
          .set('Accept', 'application/json')
          .withCredentials()
          .end(function (err, res) {
                if (!err && res.body) {
                    disptach(() => {
                        return {
                            type: actionType || GET_DATA,
                            payload: {
                                response: res.body
                            }
                        }
                    });
                }
          });

但是我收到了 CORS 错误:

XMLHttpRequest cannot load http://localhost:8000/api/getContentByType?category=all. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:5050' is therefore not allowed access

有什么建议可以解决这个问题吗?非常感谢

5个回答

另一种解决方法是直接将所需的 CORS 标头添加到开发服务器:

devServer: {
  ...
  headers: {
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
    "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
  }
}

文档链接

添加这个对我不起作用,没有任何改变。我仍然收到缺少 access-control-allow-headers 标头的错误。
2021-05-23 08:39:48
如果您还通过某些重定向(代理、ssh 重定向等)使用浏览器,请使用 devServer 选项sockPort: 'location',这样套接字端口将使用与位置端口相同的端口,这通常就足够了。
2021-06-04 08:39:48
2021-06-06 08:39:48
通常只需将“Access-Control-Allow-Origin”放在那里就足够了。
2021-06-08 08:39:48
你在哪里找到这个的任何链接?
2021-06-11 08:39:48

使用 webpack-dev-server 1.15.X 你可以在你的配置文件中使用这个配置:

devServer: {
   contentBase: DIST_FOLDER,
   port: 8888,
   // Send API requests on localhost to API server get around CORS.
   proxy: {
      '/api': {
         target: {
            host: "0.0.0.0",
            protocol: 'http:',
            port: 8080
         },
         pathRewrite: {
            '^/api': ''
         }
      }
   }
},

在此示例中,您将重定向所有来自http://0.0.0.0:8888/api/*tohttp://0.0.0.0:8080/*和 CORS 解决的调用

我相信这是一个有点不同的问题,但显然只是设置port: 8080对我来说就足够了。我只想启用“热重载”(使用 Vue 时)。不管怎样,谢谢你!
2021-06-04 08:39:48
我喜欢这个解决方案,因为据我所知,这个设置最接近典型的生产设置,例如适当的 NGINX 配置将类似地将前端 + 后端统一在同一来源下。
2021-06-07 08:39:48
这对我不起作用。仍然收到异常说 Access to fetch at ' localhost:8080/api/auth ' from origin ' localhost:9000 ' 已被 CORS 策略阻止:'Access-Control-Allow-Origin' 标头具有值 ' localhost:7000 '。我故意在后端添加了“ localhost:7000 ”。只是为了验证代理是否在我的前端工作,此设置不会限制我的 api 调用。
2021-06-15 08:39:48

您正在运行您的 JavaScript,localhost:5050但您的 API 服务器是localhost:8000. 这违反了同源策略,因此浏览器不允许这样做。

您可以修改您的 API 服务器以启用 CORS,或者按照webpack-dev-server 页面上“与现有服务器结合”下的说明将资产服务与 webpack-dev-server 和您自己的 API 服务器结合起来。

2021-06-10 08:39:48
第二个链接现在已断开
2021-06-18 08:39:48

有同样的问题,但我的 api 使用的是 https 协议(https://api ....)。必须使用 https 启动服务器并使用 https://localhost:8080

devServer: {
    https: true,
    headers: {
        "Access-Control-Allow-Origin": "*",
    },
    // ....
}
这正是我要找的!谢谢!!
2021-05-24 08:39:48

对此有 2 种解决方案。第一个是在客户端设置代理,第二个是在服务器上设置 CORS。CORS 是服务器问题,服务器不允许来自不同来源的访问。即使使用不同的端口也被认为是不同的来源

第一个解决方案

在您的后端代码中,您必须设置此标头:这是 express node.js 中的示例

app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader(
    "Access-Control-Allow-Methods",
    "OPTIONS, GET, POST, PUT, PATCH, DELETE"
  );
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
  next();
});

第二种解决方案:

在 webpack config.js 中,如果你想传递任何变量,我们导出

module.exports=function(env){
return {}} 

代替

module.exports={}

我们env通过脚本注入它

"dev-server": "webpack-dev-server --env.api='https://jsonplaceholder.typicode.com/users'",

现在 webpack 可以访问这个 env。在 webpack.config.js 中

module.exports = function ({
  api = "https://jsonplaceholder.typicode.com/users",
}) {
  return {
    entry: { main: "./src/index.js" },
    output: {
      path: path.resolve(__dirname, "public"),
      filename: "[name]-bundle.js",
      publicPath: "/",
    },
    mode: "development",
    module: {
      rules: [
        {
          loader: "babel-loader",
          test: /\.js$/,
          exclude: [/node_modules/],
        },
        
        {
          // Load other files, images etc
          test: /\.(png|j?g|gif|ico)?$/,
          use: "url-loader",
        },
        {
          test: /\.s?css$/,
          use: ["style-loader", "css-loader", "sass-loader"],
        },
      ],
    },
    //Some JavaScript bundlers may wrap the application code with eval statements in development.
    //If you use Webpack, using the cheap-module-source-map setting in development to avoid this problem
    devtool: "cheap-module-eval-source-map",
    devServer: {
      contentBase: path.join(__dirname, "public"),
      historyApiFallback: true,
      proxy: {
        "/api": {
          changeOrigin: true,
          cookieDomainRewrite: "localhost",
          target: api,
          onProxyReq: (proxyReq) => {
            if (proxyReq.getHeader("origin")) {
              proxyReq.setHeader("origin", api);
            }
          },
        },
      },
    },
    
  };
};