带有凭据的 Webpack-dev-server CORS 错误

Posted

技术标签:

【中文标题】带有凭据的 Webpack-dev-server CORS 错误【英文标题】:Webpack-dev-server CORS error with credentials 【发布时间】:2018-01-16 11:02:24 【问题描述】:

我在热模块重新加载时遇到了 CORS 问题 - 开发服务器。我在端口 3000 上使用开发服务器,但应用程序是从另一个端口 http://localhost:52024/ 提供服务的。

这是我遇到的错误(Chrome、Windows 10):

GET http://localhost:3000//sockjs-node/info?t=1502216500095 404 (Not Found)
XMLHttpRequest cannot load http://localhost:3000//sockjs-node/info?t=1502216500095. The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin 'http://localhost:52024' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
[WDS] Disconnected!

实际上我得到了两个错误:第一个是由路径中的双斜杠//引起的,另一个是与CORS相关的错误。这是我的webpack.config.js

const webpack = require('webpack'),
    path = require('path');

module.exports = 
    entry: 
        'admin': ['webpack-dev-server/client?http://localhost:3000', 'webpack/hot/only-dev-server', './src/admin/index.js']
    ,
    output: 
        path: path.join(__dirname, 'admin/dist'),
        filename: '[name].js',
        publicPath: 'http://localhost:3000'
    ,
    module: 
        rules: [
             test: /\.js$/, include: path.join(__dirname, 'src'), use: ['react-hot-loader/webpack', 'babel-loader'] ,
             test: /\.css/, use: ['style-loader', 'css-loader'] ,
             test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] ,
             test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/, use: ['url-loader?limit=10000&mimetype=application/font-woff'] ,
             test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, use: ['file-loader'] ,
             test: /\.(png|jpg)$/, use: ['url-loader?limit=8192'] 
        ]
    ,
    plugins: [
        new webpack.HotModuleReplacementPlugin(),
    ],
    devtool: 'cheap-module-eval-source-map',
    devServer: 
        port: 3000,
        hot: true,
        inline: true,
        headers: 
            "Access-Control-Allow-Origin": "*"
        
    
;

我开始使用 webpack:

webpack-dev-server --config webpack.config.js --progress

有什么想法吗?我正在使用webpack 3.5.1webpack-dev-server 2.7.1 谢谢。

【问题讨论】:

【参考方案1】:

就解决 CORS 问题而言,您可以执行以下操作之一:

在您的webpack.config.js 硬编码http://localhost:52024 作为允许的来源进入Access-Control-Allow-Origin 响应标头的值:

headers: 
    "Access-Control-Allow-Origin": "http://localhost:52024"

当然,一旦您为应用程序设置了生产服务器/域,请将 http://localhost:52024 更改为生产源。

当然,最大的限制是,只有在源站运行的应用程序才能获得来自该 webpack 服务器跨域的响应。

或者,在处理响应请求的 webpack 开发服务器上运行的任何其他应用程序代码中,您需要获取 Origin 请求标头的值并将其回显到 Access-Control-Allow-Origin 响应中-标头值:

response.setHeader('Access-Control-Allow-Origin', request.headers.origin)

这将与Access-Control-Allow-Origin: * 具有相同的效果,因为它会导致浏览器允许在任何来源运行的任何前端 javascript 访问响应——但它也会阻止浏览器强加该 “...当请求的凭据模式是 include 时,不能是通配符 * 否则会受到限制。


更新:在任何一种情况下,您还需要发送带有值 trueAccess-Control-Allow-Credentials 响应标头,以使浏览器允许您的前端 JavaScript 代码访问响应如果请求中包含凭据。

【讨论】:

【参考方案2】:

奇怪,我现在遇到了同样的双斜线问题。这可能是一个 Webpack 错误,我不确定。从modules.export 对象中删除output.publicPath 为我修复了它。我的配置是这样的:

output: 
    filename: '[name].js',
    chunkFilename: '[name].js',
    path: path.resolve(__dirname, 'dist_dev'),
    publicPath: '/'
,

您可以在 html 模板中使用 <base href="http://localhost:3000/"> 代替 output.publicPath 选项。见this answer。

关于 CORS 问题,您可以尝试按照 here 的建议将访问控制标头添加到开发服务器。

【讨论】:

谢谢,我尝试了您的解决方案,但没有奏效,没有任何改变。

以上是关于带有凭据的 Webpack-dev-server CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

带有热重载的 ReactJS 服务器端渲染 (webpack-dev-server)

用于 CORS 请求的 webpack-dev-server 配置

在 CORS 中,是不是已预先发送带有凭据的 POST 请求?

在 CORS 中,是不是已预先发送带有凭据的 POST 请求?

带有 Terraform 的 Google Cloud 凭据

带有 paypal ios sdk 的应用程序。沙盒和实时凭据?