奇怪的反向代理行为

奇怪的反向代理行为

我的目标是设置 http/https 代理重定向检查器

Google App Engine 有一些地理区域,所以我用的是这个。我使用 nodejs 创建了服务器,并使用标准环境进行了部署。正如我在 stackdriver 中看到的,应用程序引擎不提供访问权限。它在本地主机上运行良好,但如果我们部署,它会失败,因为从不执行。在创建自己的服务器(没有额外的库)之前,我部署了另外两个代理服务器(anyproxy 和 http-proxy),我得到了相同的响应。这似乎是 bug。

以下部署的代码

'use strict';
const http = require('http');
const net = require('net');
const url = require('url');

const proxyServer = http.createServer((clientReq, clientRes) => {
  console.log('on Request');
  console.log(clientReq.url);
  if (clientReq.url === '/') {
    clientRes.end('Use as proxy, no direct invocation')
  } else {
    const proxy = http.request(
      clientReq.url,
      {
        headers: clientReq.headers,
        method: clientReq.method
      }
    );

    proxy.on('response', (serverRes) => {
      clientRes.writeHead(
        serverRes.statusCode,
        serverRes.headers
      );
      serverRes.pipe(clientRes, {end: true});
    });

    clientReq.pipe(proxy, {end: true})
  }
});

proxyServer.on('connect', (clientRequest, clientSocket) => {
  console.log('on Connect');
  const srvUrl = url.parse(`https://${clientRequest.url}`);
  console.log(clientRequest.url, srvUrl);
  const srvSocket = net.connect(srvUrl.port, srvUrl.hostname, () => {
    clientSocket.write('HTTP/' + clientRequest.httpVersion + ' 200 OK\r\n' +
      'Connection: close\r\n' + '\r\n', 'UTF-8', () => {
      srvSocket.pipe(clientSocket);
      clientSocket.pipe(srvSocket);
    })

  });

  srvSocket.on('error', e => {
    console.log('srvSocket.on error: ', e);
  });

  clientSocket.on('error', e => {
    console.log('clientSocket.on error: ', e);
  });
});


const listener = proxyServer.listen(process.env.PORT || 3000, (err) => {
  if (err) {
    console.log('error starting server: ', err);
  }
});

看起来 proxyServer.on('connect',... 从未执行过。就像 http 代理请求未传送到应用程序(日志为空,在谷歌云的边缘反向代理上进行过滤)

有人知道在应用引擎上创建代理的解决方案吗?(无论使用哪种语言)

答案1

例如,我知道 zeit.co 不允许托管 http 代理。他们的反向代理将直接丢弃所有请求,而不会将其传递给托管函数。谷歌可能也有同样的政策。

相关内容