O Nginx configurado como um proxy reverso pode fazer isso facilmente:
http {
upstream remoteserver {
# here you add your remote server's IPs or hostnames
server 54.175.222.246; # for example here we use HTTPBin's address
keepalive 10; # maintain a maximum of 10 open connections
}
server {
listen 80;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # passing the client's IP to the remote server, on a local machine it doesn't do much though
proxy_set_header Host $http_host; # passing the Host header as requested by the client, otherwise this will default to the pool's name, "remoteserver" in this case
proxy_pass http://remoteserver; # sends the request off to the pool defined above
}
}
}
Agora você pode apontar seus scripts para o servidor local em vez do remoto, aqui está uma demonstração com curl
:
$ curl http://localhost/get -H "Host: host header is passed normally"
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "host header is passed normally",
"User-Agent": "curl/7.29.0"
},
"origin": "127.0.0.1, 1.2.3.4",
"url": "http://host header is passed normally/get"
}
Como você pode ver, até mesmo o cabeçalho do host é transmitido como está.
Ou você pode tornar a transição perfeita, fazendo com que o nome do host remoto aponte para a sua máquina local, seja em /etc/hosts
ou na configuração do seu resolvedor de DNS. Nesse caso, certifique-se de usar apenas endereços IP em vez de nomes de host na definição do conjunto na configuração do Nginx, caso contrário, o proxy também fará o loop de volta para si mesmo e isso causará um pouco de desastre.
Quando o arquivo hosts for alterado, o proxy será perfeito:
$ curl http://httpbin.org/get -v
* About to connect() to httpbin.org port 80 (#0)
* Trying 127.0.0.1...
* Connected to httpbin.org (127.0.0.1) port 80 (#0)
> GET /get HTTP/1.1
> User-Agent: curl/7.29.0
> Host: httpbin.org
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.6.2
< Date: Sun, 15 Mar 2015 00:41:54 GMT
< Content-Type: application/json
< Content-Length: 198
< Connection: keep-alive
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
<
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.29.0"
},
"origin": "127.0.0.1, 1.2.3.4",
"url": "http://httpbin.org/get"
}
Como você pode ver, nosso servidor local se comporta exatamente como o remoto e qualquer programa que tente acessar o nome do host remoto se conectará ao nosso servidor local.
Observe que isso pode exigir configuração adicional para hosts baseados em HTTPS.