Как я могу использовать прокси-сервер http с node.js http.Client?
137
Я хочу сделать исходящий HTTP-вызов из node.js, используя стандарт http.Client. Но я не могу подключиться к удаленному серверу напрямую из моей сети, и мне нужно пройти через прокси.
У меня та же проблема. Node.js находится за брандмауэром, и я не могу создать HTTPClient для внешнего веб-сайта.
ddallala
Ответы:
153
Тим Макфарлейн «s ответ был близок с относительно использования HTTP - прокси.
Использовать HTTP-прокси (для незащищенных запросов) очень просто. Вы подключаетесь к прокси-серверу и делаете запрос в обычном режиме, за исключением того, что часть пути включает полный URL-адрес, а заголовок хоста настроен на хост, к которому вы хотите подключиться.
Тим был очень близок со своим ответом, но он пропустил правильную настройку заголовка хоста.
Есть ли способ использовать HTTP-прокси для подключения через порт https? Кажется, нет простого метода
Гохан
@ Gohan См. Ответ Криса ниже для примера того, как подключиться к серверу https через прокси-сервер http.
HairOfTheDog
если вы получили
неверный
9
Как я могу интегрировать прокси-пользователя и прокси-пароль в блоке параметров?
Твистлтон
Это изменилось? Даже с конечным пунктом назначения в качестве другого локального сервера, я получаю 404, и сервер назначения никогда не получает запрос ..
OJFord
53
Вы можете использовать запрос , я только что обнаружил, что невероятно легко использовать прокси на node.js, только с одним внешним параметром «прокси», даже более того, он поддерживает HTTPS через прокси http.
Работал на обоих httpи httpsв моем случае, большое спасибо
Самуэль Буши
Есть идеи, почему это не сработает для внутренних страниц корпорации?
Кейнабель
1
Я удивлен, что внутренние корпоративные страницы находятся за прокси. Вы уверены, что прокси не обходится для внутренних страниц? Это на другом влане?
Ханох
Вам нужно как-то указать аутентификацию (опубликую здесь, если я это выясню)
Игорь Л.
Я получил эту ошибку, используя запрос с прокси: Ошибка: не удалось установить туннельный сокет, причина = подключение ECONNREFUSED 127.0.0.1:80
Федерико Качча
35
Одна вещь, на которую у меня ушло некоторое время, чтобы понять, используйте http для доступа к прокси, даже если вы пытаетесь прокси через https сервер. Это работает для меня, используя Чарльз (анализатор протокола OSX):
var http = require('http');
http.get({
host:'127.0.0.1',
port:8888,
path:'https://www.google.com/accounts/OAuthGetRequestToken'},function(response){
console.log (response);});
Вышеупомянутый код не работает для меня, и это связано с проблемой github.com/joyent/node/issues/2474. Проверьте ответ koichik. Мы должны использовать «method»: «connect» и при событии «connect», мы отправили информацию о пути ,
Палани
16
Как уже упоминалось здесь, @Renat, проксированный HTTP-трафик приходит в виде довольно обычных HTTP-запросов. Сделайте запрос к прокси, передавая полный URL-адрес назначения в качестве пути.
Похоже, это работает, хотя Fiddler называет это нарушением протокола, из которого следует, что это неправильный HTTP-запрос через прокси-сервер ...
Marc
11
Я подумал, что добавлю этот модуль, который я нашел: https://www.npmjs.org/package/global-tunnel , который отлично сработал для меня (сработал сразу со всем моим кодом и сторонними модулями только с кодом ниже).
Это сработало для меня! На самом деле таким образом вы отделяете прокси от кода и используете существующую конфигурацию для npm! это путь, я бы сказал
cesaregb
@NeelBasu Да, это так
майор-манн
10
Я купил частный прокси-сервер, после покупки я получил:
255.255.255.255// IP address of proxy server99999// port of proxy server
username // authentication username of proxy server
password // authentication password of proxy server
И я хотел использовать это. Первый ответ и второй ответ работали только для http (прокси) -> http (назначение), однако я хотел http (proxy) -> https (назначение).
А для адресата https лучше использовать HTTP-туннель напрямую. Я нашел решение здесь . Финальный код:
const http = require('http')const https = require('https')const username ='username'const password ='password'const auth ='Basic '+Buffer.from(username +':'+ password).toString('base64')
http.request({
host:'255.255.255.255',// IP address of proxy server
port:99999,// port of proxy server
method:'CONNECT',
path:'kinopoisk.ru:443',// some destination, add 443 port for https!
headers:{'Proxy-Authorization': auth
},}).on('connect',(res, socket)=>{if(res.statusCode ===200){// connected to proxy server
https.get({
host:'www.kinopoisk.ru',
socket: socket,// using a tunnel
agent:false,// cannot use a default agent
path:'/your/url'// specify path to get from server},(res)=>{let chunks =[]
res.on('data', chunk => chunks.push(chunk))
res.on('end',()=>{
console.log('DONE',Buffer.concat(chunks).toString('utf8'))})})}}).on('error',(err)=>{
console.error('error', err)}).end()
Например, объект запроса 'r' ниже использует localproxy для доступа к своим запросам:
var r = request.defaults({'proxy':'http://localproxy.com'})
http.createServer(function(req, resp){if(req.url ==='/doodle.png'){
r.get('http://google.com/doodle.png').pipe(resp)}})
К сожалению, нет никаких «глобальных» настроек по умолчанию, так что пользователи библиотек, которые используют это, не могут изменить прокси, если библиотека не проходит через http-опции ...
http-пакет запроса позволяет вашему коду переключаться между прокси и не прокси-использованием (что весьма полезно на моем ноутбуке).
Джон Мэдисон
5
По сути, вам не нужна явная поддержка прокси. Прокси-протокол довольно прост и основан на обычном протоколе HTTP. Вам просто нужно использовать прокси-хост и порт при соединении с HTTPClient. Пример (из документа node.js):
var http = require('http');var google = http.createClient(3128,'your.proxy.host');var request = google.request('GET','/',{'host':'www.google.com'});
request.end();...
Таким образом, вы подключаетесь к своему прокси-серверу, но делаете запрос на "http://www.google.com".
Узел должен поддерживать использование переменной окружения http_proxy - поэтому он кроссплатформенный и работает с настройками системы, а не требует настройки для каждого приложения.
Используя предоставленные решения, я бы порекомендовал следующее:
CoffeeScript
get_url =(url, response)->if process.env.http_proxy?
match = process.env.http_proxy.match /^(http:\/\/)?([^:\/]+)(:([0-9]+))?/i
if match
http.get{ host: match[2], port:(if match[4]? then match[4]else80), path: url }, response
return
http.get url, response
Использование
Чтобы использовать этот метод, просто замените http.get, например, следующий пример записывает страницу индекса google в файл с именем test.htm:
Настройка http_proxy не оказывает никакого влияния при запуске Node в Windows.
EricLaw
Он должен работать под Windows (это основная система, которую я использую). После настройки убедитесь, что вы сбросили сеанс терминала (если он установлен через панель управления, а не установлен). Вы должны быть в состоянии проверить, что он установлен правильно, используя echo% HTTP_PROXY%. Или, что еще лучше, вы должны использовать сам узел, узел -e "console.log (process.env.http_proxy);" Это работало для меня под Windows, так что удачи.
Люк
1
Ответ Имскулла почти сработал для меня, но мне пришлось внести некоторые изменения. Единственное реальное изменение - это добавление имени пользователя, пароля и установка rejectUnauthorized в false. Я не мог комментировать, поэтому я добавил это в ответ.
Я думаю, что есть лучшая альтернатива ответам по состоянию на 2019 год. Мы можем использовать global-tunnel-ngпакет для инициализации прокси-сервера и не загрязнять httpили httpsосновывать код повсюду. Итак, сначала установите global-tunnel-ngпакет:
npm install global-tunnel-ng
Затем измените ваши реализации, чтобы инициализировать прокси-сервер, если это необходимо:
Может быть, это не та строчка, на которую вы надеялись, но вы можете взглянуть на http://github.com/nodejitsu/node-http-proxy, поскольку это может пролить некоторый свет на то, как вы можете использовать свое приложение с http. Клиент.
Судя по ответам из этой ветки, вы можете использовать прокси-цепочки
для запуска node.js через прокси-сервер: $ proxychains /path/to/node application.js
Лично я не смог установить ни одну из версий прокси-цепочек в среде Cygwin / Windows, поэтому не смог ее протестировать.
Кроме того, они также говорили об использовании connect-proxy, но я не смог найти никакой документации о том, как это сделать.
Короче говоря, я все еще застрял, но, возможно, кто-то может использовать эту информацию, чтобы найти подходящий обходной путь.
В nodejs вы можете использовать Buffer для кодирования
var encodedData =Buffer.from('myuser:mypassword').toString('base64');
console.log(encodedData);
Например, в браузерах вы можете кодировать в base64 с помощью btoa () , что полезно при запросах ajax в браузере без настроек прокси, выполняющих запрос с использованием прокси.
var encodedData = btoa('myuser:mypassword')
console.log(encodedData);
Если у нас не настроен пользовательский DNS (который выдает что-то вроде ERR_NAME_NOT_RESOLVED), когда мы выполняем запрос, ответ (код 407) должен сообщить в заголовках ответа, какую схему аутентификации http использует прокси-сервер.
Ответы:
Тим Макфарлейн «s ответ был близок с относительно использования HTTP - прокси.
Использовать HTTP-прокси (для незащищенных запросов) очень просто. Вы подключаетесь к прокси-серверу и делаете запрос в обычном режиме, за исключением того, что часть пути включает полный URL-адрес, а заголовок хоста настроен на хост, к которому вы хотите подключиться.
Тим был очень близок со своим ответом, но он пропустил правильную настройку заголовка хоста.
Для справки: его ответ работает с http://nodejs.org/, но это потому, что их серверу не все равно, что заголовок хоста неверен.
источник
404
, и сервер назначения никогда не получает запрос ..Вы можете использовать запрос , я только что обнаружил, что невероятно легко использовать прокси на node.js, только с одним внешним параметром «прокси», даже более того, он поддерживает HTTPS через прокси http.
источник
http
иhttps
в моем случае, большое спасибоОдна вещь, на которую у меня ушло некоторое время, чтобы понять, используйте http для доступа к прокси, даже если вы пытаетесь прокси через https сервер. Это работает для меня, используя Чарльз (анализатор протокола OSX):
источник
Как уже упоминалось здесь, @Renat, проксированный HTTP-трафик приходит в виде довольно обычных HTTP-запросов. Сделайте запрос к прокси, передавая полный URL-адрес назначения в качестве пути.
источник
Я подумал, что добавлю этот модуль, который я нашел: https://www.npmjs.org/package/global-tunnel , который отлично сработал для меня (сработал сразу со всем моим кодом и сторонними модулями только с кодом ниже).
Сделайте это один раз, и все http (и https) в вашем приложении будут проходить через прокси.
Поочередно звоню
Будет использовать
http_proxy
переменную средыисточник
Я купил частный прокси-сервер, после покупки я получил:
И я хотел использовать это. Первый ответ и второй ответ работали только для http (прокси) -> http (назначение), однако я хотел http (proxy) -> https (назначение).
А для адресата https лучше использовать HTTP-туннель напрямую. Я нашел решение здесь . Финальный код:
источник
Http-пакет 'request', кажется, имеет эту функцию:
https://github.com/mikeal/request
Например, объект запроса 'r' ниже использует localproxy для доступа к своим запросам:
К сожалению, нет никаких «глобальных» настроек по умолчанию, так что пользователи библиотек, которые используют это, не могут изменить прокси, если библиотека не проходит через http-опции ...
HTH, Крис
источник
По сути, вам не нужна явная поддержка прокси. Прокси-протокол довольно прост и основан на обычном протоколе HTTP. Вам просто нужно использовать прокси-хост и порт при соединении с HTTPClient. Пример (из документа node.js):
Таким образом, вы подключаетесь к своему прокси-серверу, но делаете запрос на "http://www.google.com".
источник
Если вам нужно использовать базовую авторизацию для вашего прокси-провайдера, просто используйте следующее:
источник
Узел должен поддерживать использование переменной окружения http_proxy - поэтому он кроссплатформенный и работает с настройками системы, а не требует настройки для каждого приложения.
Используя предоставленные решения, я бы порекомендовал следующее:
CoffeeScript
Javascript
Использование Чтобы использовать этот метод, просто замените http.get, например, следующий пример записывает страницу индекса google в файл с именем test.htm:
источник
Ответ Имскулла почти сработал для меня, но мне пришлось внести некоторые изменения. Единственное реальное изменение - это добавление имени пользователя, пароля и установка rejectUnauthorized в false. Я не мог комментировать, поэтому я добавил это в ответ.
Если вы запустите код, он получит заголовки текущих статей в Hacker News, согласно этому руководству: http://smalljs.org/package-managers/npm/
источник
Я думаю, что есть лучшая альтернатива ответам по состоянию на 2019 год. Мы можем использовать
global-tunnel-ng
пакет для инициализации прокси-сервера и не загрязнятьhttp
илиhttps
основывать код повсюду. Итак, сначала установитеglobal-tunnel-ng
пакет:Затем измените ваши реализации, чтобы инициализировать прокси-сервер, если это необходимо:
источник
Может быть, это не та строчка, на которую вы надеялись, но вы можете взглянуть на http://github.com/nodejitsu/node-http-proxy, поскольку это может пролить некоторый свет на то, как вы можете использовать свое приложение с http. Клиент.
источник
http://groups.google.com/group/nodejs/browse_thread/thread/d5aadbcaa00c3f7/12ebf01d7ec415c3?lnk=gst&q=proxy#12ebf01d7ec415c3
Судя по ответам из этой ветки, вы можете использовать прокси-цепочки для запуска node.js через прокси-сервер:
$ proxychains /path/to/node application.js
Лично я не смог установить ни одну из версий прокси-цепочек в среде Cygwin / Windows, поэтому не смог ее протестировать.
Кроме того, они также говорили об использовании connect-proxy, но я не смог найти никакой документации о том, как это сделать.
Короче говоря, я все еще застрял, но, возможно, кто-то может использовать эту информацию, чтобы найти подходящий обходной путь.
источник
Для использования прокси с https я попробовал совет на этом сайте (используя зависимость https-proxy-agent ), и он работал для меня:
http://codingmiles.com/node-js-making-https-request-via-proxy/
источник
используйте https-proxy-agent как это
источник
Если у вас есть базовая схема http-аутентификации, вы должны создать строку base64
myuser:mypassword
, а затем добавить «Basic» в начале. Это значение заголовка Proxy-Authorization , вот пример:В nodejs вы можете использовать Buffer для кодирования
Например, в браузерах вы можете кодировать в base64 с помощью btoa () , что полезно при запросах ajax в браузере без настроек прокси, выполняющих запрос с использованием прокси.
Как узнать, какая схема принимает прокси-сервер?
Если у нас не настроен пользовательский DNS (который выдает что-то вроде ERR_NAME_NOT_RESOLVED), когда мы выполняем запрос, ответ (код 407) должен сообщить в заголовках ответа, какую схему аутентификации http использует прокси-сервер.
источник