我正在使用Cloud9作为一个环境。io ubuntu虚拟机在线IDE和我已经减少了这个错误,只是运行应用程序与Webpack开发服务器。

我用:

webpack-dev-server -d --watch --history-api-fallback --host $IP --port $PORT

$IP是一个包含主机地址的变量 $PORT包含端口号。

当在Cloud 9中部署应用程序时,我被指示使用这些变量,因为它们有默认的IP和PORT信息。

服务器启动并编译代码,没有问题,但它没有显示索引文件。只有一个空白屏幕与“无效的主机标题”作为文本。

这是请求:

GET / HTTP/1.1
Host: store-client-nestroia1.c9users.io
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Accept: 
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8

这是我的package.json:

{
  "name": "workspace",
  "version": "0.0.0",
  "scripts": {
    "dev": "webpack -d --watch",
    "server": "webpack-dev-server -d --watch --history-api-fallback --host $IP --port $PORT",
    "build": "webpack --config webpack.config.js"
  },
  "author": "Artur Vieira",
  "license": "ISC",
  "dependencies": {
    "babel-core": "^6.18.2",
    "babel-loader": "^6.2.8",
    "babel-preset-es2015": "^6.18.0",
    "babel-preset-react": "^6.16.0",
    "babel-preset-stage-0": "^6.24.1",
    "file-loader": "^0.11.1",
    "node-fetch": "^1.6.3",
    "react": "^15.5.4",
    "react-bootstrap": "^0.30.9",
    "react-dom": "^15.5.4",
    "react-router": "^4.1.1",
    "react-router-dom": "^4.1.1",
    "url-loader": "^0.5.8",
    "webpack": "^2.4.1",
    "webpack-dev-server": "^2.4.4",
    "whatwg-fetch": "^2.0.3"
  }
}

这是webpack.config.js:

const path = require('path');

module.exports = {

  entry: ['whatwg-fetch', "./app/_app.jsx"], // string | object | array
  // Here the application starts executing
  // and webpack starts bundling
  output: {
    // options related to how webpack emits results

    path: path.resolve(__dirname, "./public"), // string
    // the target directory for all output files
    // must be an absolute path (use the Node.js path module)

    filename: "bundle.js", // string
    // the filename template for entry chunks

    publicPath: "/public/", // string
    // the url to the output directory resolved relative to the HTML page
  },

  module: {
    // configuration regarding modules

    rules: [
      // rules for modules (configure loaders, parser options, etc.)
      {
        test: /\.jsx?$/,
        include: [
          path.resolve(__dirname, "./app")
        ],
        exclude: [
          path.resolve(__dirname, "./node_modules")
        ],
        loader: "babel-loader?presets[]=react,presets[]=es2015,presets[]=stage-0",
        // the loader which should be applied, it'll be resolved relative to the context
        // -loader suffix is no longer optional in webpack2 for clarity reasons
        // see webpack 1 upgrade guide
      },
      {
        test: /\.css$/,
        use: [ 'style-loader', 'css-loader' ]
      },
      {
        test: /\.(png|jpg|jpeg|gif|svg|eot|ttf|woff|woff2)$/,
        loader: 'url-loader',
        options: {
          limit: 10000
        }
      }
    ]
  },

  devServer: {
    compress: true
  }
}

Webpack开发服务器返回这个,因为我的主机设置。在webpack-dev-server/lib/Server.js第60行。从https://github.com/webpack/webpack-dev-server

我的问题是我如何设置正确通过这个检查。任何帮助都将不胜感激。


当前回答

vue-cli用户注意事项:

将vue.config.js文件放在根目录下,使用相同的代码行:

module.exports = {
  configureWebpack: {
    devServer: {
      public: '0.0.0.0:8080',
      host: '0.0.0.0',
      disableHostCheck: true,
    }
  }
};

其他回答

我刚刚在使用Windows子系统for Linux (WSL2)时遇到了这个问题,所以我也将分享这个解决方案。

我的目标是在wsl:3000和localhost:3000中呈现webpack的输出,从而创建一个备用的本地端点。

如您所料,这最初会导致出现“无效主机头”错误。似乎没有什么帮助,直到我添加了如下所示的devServer配置选项。


module.exports = {
  //...
  devServer: {
    proxy: [
      {
        context: ['http://wsl:3000'],
        target: 'http://localhost:3000',
      },
    ],
  },
}

这在不引入任何安全风险的情况下修复了“错误”。

参考资料:webpack DevServer docs

我发现,我需要将devServer的公共属性设置为请求的主机值。因此,它将显示在该外部地址。

所以我需要在我的webpack.config.js中

devServer: {
  compress: true,
  public: 'store-client-nestroia1.c9users.io' // That solved it
}

另一个解决方案是在CLI中使用它:

webpack-dev-server --public $C9_HOSTNAME   <-- var for Cloud9 external IP

我通过在nginx配置中添加主机头的代理来解决这个问题,就像这样:

server {
    listen 80;
    server_name     localhost:3000;

    location / {
        proxy_pass http://myservice:8080/;

        proxy_set_header HOST $host;
        proxy_set_header Referer $http_referer;
    }
}

我补充说:

proxy_set_header主机

$http_referer;

当发出HTTP请求时,默认情况下,浏览器/客户端包括“主机”(来自URL)作为原始HTTP请求头的一部分。作为额外的安全性/完整性检查的一部分(现在很常见),Host头必须与HTTP服务器所期望的内容相匹配,以便服务器向您发送您所期望的内容。

默认情况下,Webpack Dev Server (WDS)只接受带有主机头的传入HTTP请求,该主机头与一些常见主机名(如localhost)匹配。当一个带有意外Host头的请求进入时,服务器仍然需要用一些东西来响应。因此,它尽其所能:发送一个带有标准HTTP错误代码的响应,并在HTML中发送一条人类可读的消息:“Invalid Host header”。

现在,至于如何解决这个问题,基本上有两个选择。告诉WDS接受更多(或全部)“Host”报头或修复与HTTP请求一起发送的Host报头。

配置Webpack

Generally, it's easier (and more correct) to tell the WDS configuration to allow more "Host"names to be used. By default, WDS only accepts connections from the local development machine and so, by default, only needs to support the hostname localhost. Most commonly this "Invalid Host header" issue comes up when trying to server to other clients on the network. After adding host: '0.0.0.0' to the devServer configuration, WDS needs to be told which names might be used by clients to talk to it. require('os').hostname() is usually (one of) the hostnames but other names could be just as valid. Because of this, WDS accepts a list of allowed names.

module.exports = {
  //...
  devServer: {
    allowedHosts: [
      require('os').hostname(),
      'host.com',
      'subdomain.host.com',
      'subdomain2.host.com',
      'host2.com'
    ]
  }
};

然而,有时获得正确的列表是比它的价值更多的麻烦,它足够好,只是告诉WDS忽略Host头检查。在Webpack 4中,它是disableHostCheck选项。在Webpack 5中,allowwedhosts选项可以设置为单个字符串'all'(没有数组)。

创建React App (CRA)

流行的程序包create-react-app内部使用Webpack。CRA有一个额外的环境变量来覆盖这个特定的设置:DANGEROUSLY_DISABLE_HOST_CHECK=true。

发送不同的主机报头

如果改变Webpack的配置是不可能的,另一种解决方法是改变客户端的配置。

一个技巧是在客户机上使用hosts文件,以便所需的主机名映射到服务器的IP。

更常见的情况是反向代理位于WDS的前面。对于发送到后端(WDS)的请求,不同的代理具有不同的默认值。正如VivekDev的回答所建议的那样,您可能需要专门将Host头添加到后端请求中。

React开发者们好!

而不是这样做 在webpackDevServer.config.js中disableHostCheck: true。你可以通过添加一个。env文件到你的项目中,在。env文件中添加变量host =0.0.0.0和DANGEROUSLY_DISABLE_HOST_CHECK=true来轻松解决“无效主机头”错误。如果你想改变webpackDevServer.config.js,你需要使用'npm run eject'来提取反应脚本,不建议这样做。因此,更好的解决方案是在项目的.env文件中添加上述变量。

快乐编码:)