Я получаю сообщение «Invalid Host header» при запуске моего приложения React на сервере Webpack dev на Cloud9.io

177

Я использую в качестве среды Cloud9.io Ubuntu VM Online IDE, и из-за устранения этой ошибки я сократил ее до простого запуска приложения с сервером Webpack dev.

Я запускаю это с:

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 возвращает это из-за моей настройки хоста. В строке 60 webpack-dev-server / lib / Server.js. С https://github.com/webpack/webpack-dev-server

У меня вопрос, как мне правильно настроить эту проверку? Любая помощь будет принята с благодарностью.

Артур Виейра
источник
Кажется, проблема выходит за рамки комментариев.
Элмайстер
Я не понимаю, как происходит проблема. Не могли бы вы указать мне правильное направление?
Артур Виейра
Ну получается в моем случае верхний ответ сработал.
MrMesees

Ответы:

314

Проблема возникает потому, что webpack-dev-server2.4.4 добавляет проверку хоста. Вы можете отключить его, добавив это в конфигурацию вашего веб-пакета:

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

 }      

РЕДАКТИРОВАТЬ: Обратите внимание, это исправление небезопасно.

Пожалуйста, смотрите следующий ответ для безопасного решения: https://stackoverflow.com/a/43621275/5425585

刘芳友
источник
13
Это проблема безопасности. Вместо этого используйте параметр public, чтобы указать разрешенное имя хоста. См. Medium.com/webpack/… для получения дополнительной информации.
SystemParadox
5
один публичный вариант у меня не сработал ... disableHostCheck - единственное, что его решило: \
davidkomer
@davidkomer то же самое для меня. Единственное, что работает, - это отключение HostCheck ...
irl_irl
6
Это проблема безопасности, если вы используете dev-сервер webpack для чего-то кроме локальной разработки.
AlienWebguy
Это сработало и для меня. В моем случае я использовал установку мультисайтового Worpdress, работающую на 192.168.0.106.xip.io. Странно то, что я смог работать на своей старой установке Apache Linux без этого «исправления». Не до того, как я переключился на пакет Bitnami, когда появилась эта проблема.
Hybrid Web Dev
103

Я обнаружил, что мне нужно установить publicсвойство devServer равным значению хоста моего запроса. Так как он будет отображаться по этому внешнему адресу.

Так что мне нужно это в моем webpack.config.js

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

Другое решение использует его на CLI:

webpack-dev-server --public $ C9_HOSTNAME <- var для внешнего IP-адреса Cloud9

Артур Виейра
источник
1
Столкнулся с этим и сегодня! Спасибо за публикацию!
JohnnyQ
5
Также просто столкнулся с этим сегодня. Похоже, что webpack-dev-serverнедавно это изменение потребовало правильного заголовка хоста. См. Github.com/webpack/webpack-dev-server/releases/tag/v2.4.3 для получения дополнительной информации.
Кайтроно
2
Изменения также влияют на webpack-dev-server 1.16.4. Вы можете прочитать больше об этом здесь: medium.com/webpack/… .
Тайлер Кольер
1
Это сработало и для меня, когда я столкнулся с Invalid Host headerошибкой в ​​проекте Vue Cli.
Тимми фон Хейсс
43

Вот что сработало для меня:

Добавьте позволенные хосты под devServer в ваш webpack.config.js:

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

Мне не нужно было использовать параметры --host или --public.

irl_irl
источник
Если у вас есть HotModuleReload, кажется, что publicparam - это то, что задает URL, используемый в качестве цели для этого (если он не может угадать его по тому, как обслуживается страница, чего для меня он не мог).
Том Салеба
15

Добавьте эту конфигурацию в ваш файл конфигурации webpack при использовании webpack-dev-server (вы все равно можете указать хост как 0.0.0.0).

devServer: {
    disableHostCheck: true,
    host: '0.0.0.0',
    port: 3000
}
Сампатх
источник
2
Это также работает для новой конфигурации Vue.js vue-cli: github.com/vuejs/vue-cli/blob/dev/docs/config.md
CenterOrbit
10

Более безопасным вариантом было бы добавить allowHosts в конфигурацию вашего Webpack следующим образом:

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

Массив содержит все разрешенные хосты, вы также можете указать subdomians. проверить больше здесь

AV Paul
источник
5

Если вы еще не вышли из CRA, вы не можете легко изменить конфигурацию вашего веб-пакета. Конфиг файл скрыт в 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
Спасибо, Лукас Калбертодт, лучший ответ. Я использовал: export DANGEROUSLY_DISABLE_HOST_CHECK = true; Начало вечера
Марк Кан
3

Вместо того, чтобы редактировать файл конфигурации webpack, проще отключить проверку хоста, добавив .envфайл в корневую папку и поместив это:

DANGEROUSLY_DISABLE_HOST_CHECK=true

Как следует из имени переменной, ее отключение небезопасно и его рекомендуется использовать только в среде разработчика.

Кайл Ордона
источник
2

Если вы используете create-Reaction-app на C9, просто запустите эту команду для запуска

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.

ParkerD
источник