在Cloud9.io上的Webpack开发服务器中运行我的React应用程序时,我收到“无效的主机标头”消息


176

我正在使用Cloud9.io ubuntu VM Online IDE作为环境,并且通过对该错误进行故障诊断而减少了使用Webpack开发服务器运行应用程序的速度。

我用以下命令启动它:

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

$ IP是具有主机地址的变量,$ PORT具有端口号。

我被指示在Cloud 9中部署应用程序时使用这些var,因为它们具有默认的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

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


似乎问题不在评论范围之内。
elmeister

我不明白问题是怎么发生的。你能指出我正确的方向吗?
Artur Vieira

好吧,事实证明,最有效的答案是有效的。
MrMesees

Answers:


311

发生此问题的原因是webpack-dev-server2.4.4添加了主机检查。您可以通过将其添加到您的webpack配置中来禁用它:

 devServer: {
    compress: true,
    disableHostCheck: true,   // That solved it

 }      

编辑:请注意,此修复程序不安全。

请参阅以下答案以获取安全的解决方案:https : //stackoverflow.com/a/43621275/5425585


13
这是一个安全问题。改用public选项来指定允许的主机名。有关更多信息,请参见medium.com/webpack/…
SystemParadox

5
单独的公用选项对我不起作用... disableHostCheck是唯一解决它的方法:\
davidkomer

@davidkomer对我一样。唯一有效的方法是disableHostCheck ...
irl_irl

6
如果您将webpack开发服务器用于除本地开发人员以外的其他任何应用程序,则这是一个安全问题。
AlienWebguy

这也为我工作。我的情况是我使用的是安装在192.168.0.106.xip.io上的bitnami Multisite Worpdress安装。奇怪的是,即使没有这个“修复程序”,我也可以在旧的Apache Linux上工作。直到我切换到出现此问题的Bitnami软件包为止。
混合式网络开发人员,

103

我发现,我需要将publicdevServer 的属性设置为请求的主机值。由于它会显示在该外部地址。

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

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

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

webpack-dev-server --public $ C9_HOSTNAME <-用于Cloud9外部IP的var


1
今天也遇到了这个!感谢您的发表!
JohnnyQ '17

5
今天也刚遇到这个。看起来webpack-dev-server最近进行了此更改,需要正确的主机头。有关更多信息,请参见github.com/webpack/webpack-dev-server/releases/tag/v2.4.3
Kaitrono

2
更改也会影响webpack-dev-server 1.16.4。您可以在此处了解更多信息:medium.com/webpack/…
Tyler Collier

1
当我Invalid Host header在vue cli项目中遇到错误时,这也对我有用。
蒂米·冯·海斯

43

这对我有用:

在webpack.config.js中的devServer下添加allowedHosts:

devServer: {
  compress: true,
  inline: true,
  port: '8080',
  allowedHosts: [
      '.amazonaws.com'
  ]
},

我不需要使用--host或--public参数。


如果您有HotModuleReload,则似乎public是将URL设置为目标的参数(如果它无法从页面的投放方式中猜测出URL,对我而言则无法)。
汤姆·萨利巴


10

更为安全的选择是像下面这样向您的Webpack配置添加allowedHosts:

module.exports = {
devServer: {
 allowedHosts: [
  'host.com',
  'subdomain.host.com',
  'subdomain2.host.com',
  'host2.com'
   ]
  }
};

该数组包含所有允许的主机,还可以指定子域。在这里查看更多


5

如果尚未从CRA中退出,则无法轻松修改Webpack配置。配置文件隐藏在中node_modules/react_scripts/config/webpackDevServer.config.js。不鼓励您更改该配置。

相反,您可以将环境变量DANGEROUSLY_DISABLE_HOST_CHECK设置true为禁用主机检查:

DANGEROUSLY_DISABLE_HOST_CHECK=true yarn start  
# or the equivalent npm command

1
谢谢Lukas Kalbertodt,最好的答案。我曾经使用过:export DANGEROUSLY_DISABLE_HOST_CHECK = true; npm开始
马克·卡恩

3

除了编辑webpack配置文件外,禁用主机检查的更简单方法是将.env文件添加到您的根文件夹中,然后放置以下文件:

DANGEROUSLY_DISABLE_HOST_CHECK=true

就像变量名所暗示的那样,禁用它是不安全的,仅建议仅在开发环境中使用。


2

如果您在C9上使用create-react-app,请运行此命令以启动

npm run start --public $C9_HOSTNAME

并从您的主机名开始访问该应用程序(例如$C_HOSTNAME,在终端中键入以获取主机名)


0

如果您webpack-dev-server在容器中运行并通过容器名称向其发送请求,则会收到此错误。要允许来自同一网络上其他容器的请求,只需使用--public选项提供容器名称(或用于解析容器的任何名称)。这比完全禁用安全检查要好。

就我而言,我webpack-dev-server在一个名为assetsdocker-compose 的容器中运行。我将启动命令更改为:

webpack-dev-server --mode development --host 0.0.0.0 --public assets

现在,另一个容器可以通过发送请求http://assets:5000

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.