Como acessar um site em um servidor compartilhado por seu endereço IP?

18

Tenho algumas perguntas, ajude:

Primeiro, eu posso acessar a pesquisa do Google apenas digitando http://74.125.224.211, porque este é o endereço IP retornado pelo nslookup.

No entanto, não pude fazê-lo com os endereços IP retornados de www.yahoo.com. Como faço para acessar a página de pesquisa do Yahoo por seu IP?

Outro exemplo, http://www.allaboutcircuits.comserá resolvido 68.233.243.63pelo servidor DNS, mas se eu for http://68.233.243.63, recebo "Olá, mundo!".

Segundo, por alguma razão, há algo errado com os resolvedores de DNS no meu serviço de hospedagem na web (não será corrigido !!) . Então comandos como

get_file_contents("http://www.allaboutcircuits.com");

retornará php_network_getaddresses: getaddrinfo failed: Name or service not known

Como contornar isso com o endereço IP,

68.233.243.63

Quero dizer, de alguma forma, anexar o parâmetro HTTP hostname ao get_file_contents()?

Gostaria de resolver isso do meu próprio lado (no meu código), nenhuma solução de problemas / ajuste será feita pelo administrador do servidor.

user1502776
fonte
9
Leia sobre servidores virtuais e como um único host pode hospedar muitos sites.
wallyk
Suponho que há algum motivo para você não poder usar apenas o nome de domínio?
Isaac Rabinovitch
@ Isaac Rabinovitch: user1502776 diz "há algo errado com os resolvedores DNS no meu serviço de hospedagem na web (não será corrigido !!)" e "eu gostaria de resolver isso do meu próprio lado (no meu código), sem solução de problemas / o ajuste será feito pelo administrador do servidor ".
Bavi_H 15/09/12
3
Se o administrador do servidor é tão estúpido, você precisa encontrar um provedor de hospedagem na web diferente.
Michael Hampton

Respostas:

10

Como Wallyk disse, são servidores virtuais

Veja este exemplo para o apache

<VirtualHost *:80>
ServerName example2.com
DocumentRoot C:/www/example2.com
</VirtualHost>

<VirtualHost *:80>
ServerName example.com
DocumentRoot C:/www/example.com
</VirtualHost>

Em c: \ www \ example.com, crie um arquivo de índice dizendo "Hello World! Example.com"

em c: \ www \ example2.com, crie um arquivo de índice dizendo "Hellow World! example2.com"

E mude o arquivo de hosts para

127.0.0.1 example.com
127.0.0.1 example2.com

Em seguida, vá para http://example.com e, em seguida, http://example2.com

É assim que você pode ter vários sites por único IP

Então, basicamente, a resposta é: não, você não será capaz de obter esse site pelo IP.

Kris
fonte
Eu entendo que apenas o IP não é suficiente. Mas existe algum comando PHP que use IP e nome de host que forneço para buscar páginas da Web remotas? O comando não deve consultar o DNS.
user1502776
4
Embora isso possa ser tecnicamente preciso, ele não aborda a questão. A questão é perguntar como solicitar um site específico com um nome de host conhecido de um servidor com um IP conhecido, sem resolver automaticamente o endereço IP através do DNS, usando um script PHP. Não está perguntando como encontrar um nome de host correspondente a um determinado IP. O comentário de wallyk é mais relevante, porque seu link inclui informações no Hostcabeçalho necessárias para um servidor distinguir entre os sites que hospeda e servir o correto.
Bob
5

Você diz que deseja especificar manualmente o nome do host e o endereço IP, em vez de confiar em um servidor DNS fora do seu controle. Observando os comentários na documentação file_get_contents , vejo que os comentaristas resolveram problemas semelhantes criando um contexto que contém o cabeçalho Host: necessário. Algo assim:

$context = stream_context_create(array('http' => array('header' => 'Host: www.allaboutcircuits.com')));
$data = file_get_contents('http://68.233.243.63/', 0, $context);

Obviamente, esteja ciente de que a desvantagem de especificar manualmente o nome do host e o endereço IP é que, se o endereço IP mudar no futuro (por exemplo, se o site for transferido para um novo provedor de hospedagem), seu código poderá parar de funcionar até você atualiza manualmente o endereço IP.

Bavi_H
fonte
2

O endereço IP por si só não é suficiente para identificar exclusivamente em qual site você deseja acessar quando vários hosts virtuais estão em execução na mesma porta / servidor. Nesse caso, você precisa especificar o cabeçalho Host na solicitação HTTP que identifica o nome do servidor. Você pode fazer isso diretamente via telnet para a porta 80:

$ telnet 68.233.243.63 80
Trying 68.233.243.63...
Connected to 68.233.243.63.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.allaboutcircuits.com

onde você digita o comando telnet, as linhas GET e Host e, em seguida, obtém o código-fonte HTML retornado do servidor.

Ou você pode usar curl onde adiciona especificamente o cabeçalho (com o -Hsinalizador).

curl 68.233.243.63 -H "Host: www.allaboutcircuits.com"
dr jimbob
fonte
1

Segundo, por alguma razão, há algo errado com os resolvedores DNS no meu serviço de hospedagem na web (não será corrigido !!)

Você pode usar outro servidor DNS no lado do cliente, caso este não seja o host da Web - 8.8.8.8 e 8.8.8.6 são executados pelo Google e 4.4.4.2 é um modo de espera comum. O Namebench permitirá que você encontre o mais rápido. Como alternativa, você pode usar algum tipo de serviço proxy (eu corro por conta própria em um VPS ou use o Tor, mas existem outras opções).

Como esse é o PHP, uma opção ainda mais fácil seria executar o código em outro sistema. Kludges não são sustentáveis.

Journeyman Geek
fonte
parece que ele está em algum host compartilhado e não pode modificar o DNS, e é por isso que ele tem a ressalva "Eu gostaria de resolver isso do meu lado (no meu código), nenhuma solução de problemas / ajuste será feita pelo administrador do servidor. " Eu não acho que ele pode modificar o DNS. . .
ernie
11
Ele pode usar um servidor DNS alternativo no lado do cliente para testar. Se o seu host não estiver configurando os fantasmas corretamente, ele precisará de outro host.
Journeyman Geek