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.com
será resolvido 68.233.243.63
pelo 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.
fonte
Respostas:
No seu script PHP, quando você o acessa pelo endereço IP, também precisa enviar um
Host:
cabeçalho na sua solicitação com o nome de domínio correto.Esta pergunta no Stack Overflow explica como fazê-lo: /programming/356705/how-to-send-a-header-using-a-http-request-through-a-curl-call
fonte
Como Wallyk disse, são servidores virtuais
Veja este exemplo para o apache
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
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.
fonte
Host
cabeçalho necessárias para um servidor distinguir entre os sites que hospeda e servir o correto.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:
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.
fonte
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:
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
-H
sinalizador).fonte
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.
fonte