![奇怪的反向代理行为](https://linux22.com/image/736374/%E5%A5%87%E6%80%AA%E7%9A%84%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E8%A1%8C%E4%B8%BA.png)
我的目标是设置 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 代理。他们的反向代理将直接丢弃所有请求,而不会将其传递给托管函数。谷歌可能也有同样的政策。