Avatar ·

Как разрешить доступ к Angular приложению из внешней сети (не localhost)?

Привет! Я разрабатываю Angular приложение на TypeScript. Когда я запускаю `ng serve`, всё работает отлично на `http://localhost:4200`. Но мне нужно, чтобы к приложению могли обращаться другие устройства в моей локальной сети (например, с моего телефона или с другого компьютера). Когда я пытаюсь открыть `http://192.168.1.100:4200` (мой IP адрес), браузер пишет "Connection refused" или "This site can't be reached". Я пробовал запускать `ng serve --host 0.0.0.0`, но это не помогло. Более того, я использую Angular CLI версии 15, и проект настроен с помощью `angular.json`. Мне нужно, чтобы приложение было доступно не только через localhost, но и через реальный IP адрес в сети. Вот мой текущий запуск: ```typescript // package.json { "scripts": { "start": "ng serve", "build": "ng build" } } ``` Я запускаю: `npm start` или `ng serve` Проблема: при обращении с другого устройства по IP адресу (192.168.1.100:4200) соединение не устанавливается. Как правильно настроить Angular, чтобы разрешить внешний доступ? Нужно ли что-то менять в настройках брандмауэра Windows? Или есть специальные флаги для ng serve? Заранее спасибо за помощь! <<>>

Решение: использование флагов --host и --disable-host-check

Основная проблема в том, что по умолчанию Angular DevServer привязан только к localhost. Чтобы разрешить доступ из внешней сети, нужно явно указать хост и отключить проверку заголовка Host. Вот полное решение:

ng serve --host 0.0.0.0 --disable-host-check

Или в package.json:

{
  "scripts": {
    "start": "ng serve --host 0.0.0.0 --disable-host-check"
  }
}

Объяснение параметров

  • --host 0.0.0.0 — привязывает сервер ко всем сетевым интерфейсам, а не только к localhost. Это позволяет обращаться к приложению по любому IP адресу вашего компьютера (192.168.x.x, 10.0.x.x и т.д.).
  • --disable-host-check — отключает проверку заголовка Host в HTTP запросах. Без этого флага Angular DevServer отклоняет запросы, где Host не равен localhost или 127.0.0.1.

Дополнительные настройки брандмауэра

Даже после правильного запуска, может потребоваться разрешить порт 4200 в брандмауэре Windows:

  1. Откройте "Брандмауэр Защитника Windows"
  2. Нажмите "Дополнительные параметры"
  3. Создайте "Правило для входящего подключения"
  4. Тип: "Порт"
  5. Протокол: TCP
  6. Порт: 4200
  7. Разрешить подключение

Проверка работоспособности

После запуска с правильными флагами, проверьте:

# На вашем компьютере (должно работать)
curl http://localhost:4200

# С другого устройства в сети (замените IP на ваш)
curl http://192.168.1.100:4200

Важные замечания

  • Это решение подходит только для разработки и локальной сети. Для продакшена используйте ng build и разворачивайте на полноценном веб-сервере (Nginx, Apache и т.д.).
  • Флаг --disable-host-check снижает безопасность, так как позволяет любому хосту обращаться к серверу. Используйте его только в доверенной сети.
  • В Angular CLI версии 17+ флаг --disable-host-check может быть заменён на настройку в angular.json:
// angular.json
"projects": {
  "your-project": {
    "architect": {
      "serve": {
        "options": {
          "host": "0.0.0.0",
          "disableHostCheck": true
        }
      }
    }
  }
}

Этот метод гарантирует, что ваше Angular приложение будет доступно с любого устройства в локальной сети по IP адресу вашего компьютера.

<<>>

Альтернативный подход: использование --public-host

Если вы хотите более тонко настроить доступ, можно использовать флаг --public-host. Он указывает, какой хост будет использоваться для генерации URL в ответах сервера (например, для WebSocket или HMR):

ng serve --host 0.0.0.0 --public-host http://192.168.1.100:4200

Этот подход полезен, если ваше приложение использует WebSocket (например, Angular Universal с Hot Module Replacement) и вам нужно, чтобы клиенты знали точный адрес сервера. Однако для простого доступа к статическим файлам Angular достаточно первого решения.

Использование ngrok для внешнего доступа

Если вам нужен доступ не только из локальной сети, но и из интернета (например, для демонстрации клиенту), используйте ngrok:

# Установка
npm install -g ngrok

# Запуск туннеля к вашему localhost
ngrok http 4200

Ngrok создаст публичный URL (например, https://abc123.ngrok.io), который будет перенаправлять трафик на ваш локальный сервер. Это безопаснее, чем открывать порты в роутере.

Оба метода решают проблему доступа извне, но выбирайте в зависимости от ваших потребностей: для локальной сети — флаги --host и --disable-host-check, для интернета — ngrok.