2014-01-26 3 views
5

Существует функция в инструмент под названием чарльз, что позволяет отображать удаленные запросы:Перенаправление запрос HTTP с удаленного сервера на локальный сервер с помощью nodejs

http://www.charlesproxy.com/documentation/tools/map-remote/

В принципе, он может принять любой запрос на сервер (даже если вы не тот, который его запускает), а затем делает новый запрос на другой сервер, сохраняя путь и строку запроса. Ответ со второго сервера затем перезаписывает ответ с первого сервера.

Я просто хочу знать, есть ли модуль узла, который может это сделать. Я пытался использовать http-proxy, но у меня такое чувство, что этот удаленный инструмент карты немного отличается от прокси-сервера, поскольку кажется, что вы должны владеть обоими серверами с прокси-сервером.

EDIT: Пробовал снова использовать модуль узла http-proxy, но не может заставить его работать. Вот мой код:

var http = require('http') 
, httpProxy = require('http-proxy'); 

httpProxy.createServer({ 
    hostnameOnly: true, 
    router: { 
     'www.stackoverflow.com': 'localhost:9000', 
    } 
}).listen(80); 

// Create your target server 
// 
http.createServer(function (req, res) { 
    res.writeHead(200, { 'Content-Type': 'text/plain' }); 
    res.write('request successfully proxied!' + '\n' + JSON.stringify(req.headers, true, 2)); 
    res.end(); 
}).listen(9000); 

Я ожидаю, что когда я иду в www.stackoverflow.com или www.stackoverflow.com:80, он вместо того, чтобы перенаправить на мой локальный хост: 9000

ответ

4

Нет, что вы просят, действительно, просто прокси. И нет, вам не нужно «владеть» обоими серверами для запуска прокси. Вы просто проксируете запрос, и в этот момент вы можете изменить данные, как хотите.

Прокси-модуль, который вы упомянули, будет работать нормально, и есть много других. Вы также можете сделать это с помощью простой конфигурации Nginx, если хотите.

+0

Я исследовал немного больше, и не будет ли это больше, чем простой прокси, но вместо этого обратный прокси? – prashn64

+3

@ prashn64 Нет, просто прокси-сервер. Правда в том, что термин «обратный прокси» практически не имеет смысла. Обычно этот термин используется, когда вы размещаете прокси-сервер рядом с серверами для балансировки нагрузки (между прочим). Однако это всего лишь прокси-сервер. Вы добавили дополнительную информацию к своему вопросу ... настроили ли вы запись файла hosts, указывающую «www.stackoverflow.com» на любой IP-адрес вашего сервера Node.js? – Brad

+0

Если это возможно, я бы предпочел не менять конфигурацию для этого. Должна ли такая таблица маршрутизации обрабатывать? – prashn64

1

Вы добавили этот прокси в конфигурацию своего браузера? В противном случае базовая ОС будет направлять ваш запрос напрямую на www.stackoverflow.com, и ваш прокси-сервер не сможет это поймать.

1

Не могли бы вы подтвердить, что www.stackoverflow.com заканчивается на вашем узле.app вообще? В настоящее время имя будет разрешено к IP-адресу, который приведет вас к этому веб-сайту, поэтому вам нужно было бы убедиться, что имя теперь разрешено для вашего node.app. В этом случае это, вероятно, означает редактирование вашего файла hosts.

2

Я сделал это Pastebin с моим решением: http://pastebin.com/TfG67j1x

Спасите содержание Pastebin как proxy.js. Убедитесь, что вы устанавливаете зависимости в той же папке, что и файл proxy.js. (НПМ установить HTTP-прокси цвета Util --save подключении с)

При запуске прокси, он будет:

  • начать новый сервер прослушивает 8013, выступая в качестве прокси-сервера;
  • запустить демо целевой сервер прослушивания в 9013.

При обращении к демонстрационной цели через прокси-сервер, он изменяет «Рубин» строку в «nodejitsu», для удобного тестирования. Если вы находитесь за корпоративным брандмауэром/прокси-сервером, этот скрипт терпит неудачу.

ОБНОВЛЕНИЕ: Проблема с «уже отправленными заголовками» была на линии 32/33. Оказывается, при одном соединении произошло несколько ошибок. Когда происходит первая ошибка, будут отправляться заголовки, когда возникает вторая ошибка, заголовки уже отправлены; в результате возникает исключение «заголовки, уже отправленные», и сервер убит.

С этим исправлением сервер больше не умирает, но он по-прежнему не исправляет источник ошибки, а это значит, что NODE.JS не может достичь вашего целевого сайта. Вы должны быть за другим прокси-сервером или брандмауэром, а NodeJS нужно будет перенаправить HTTP-запрос на второй прокси-сервер. Если вы обычно используете прокси-сервер в своем браузере для подключения к Интернету, мое решение не удастся. Однако вы не указали это как требование.

Вы можете проверить это, обратившись через мой прокси-сервер к сети внутри вашей сети (для этого не требуется прокси-сервер).

UPDATE2: Вы не должны пытаться напрямую подключиться к http://localhost:8013, но установить его в качестве прокси-сервера в своем браузере. Обратите внимание на исходные настройки прокси-сервера браузера (см. Выше). Попробуйте и затем войдите в систему http://localhost:9013.

+1

Я получаю эту ошибку: 'http.js: 645 певд ошибки (. Может \ 'т установить заголовки после того, как они отправляются');' Это из-за проблем брандмауэра? – prashn64

+0

^Вот когда я пытаюсь подключиться к localhost: 8013 btw. – prashn64

+0

Я пробовал ваши обновления и, действительно, больше не получаю эти ошибки. Тем не менее, я все еще не получаю измененное изменение текста «Ruby» -> «nodejitsu». Кроме того, когда я нажимаю stackoverflow.com, я не перенаправляюсь на localhost: 9013. Я проверил свой прокси-сервер, и ничего не было настроено. – prashn64

Смежные вопросы