18

У меня есть несколько вопросов, пожалуйста, помогите:

Во-первых, я могу получить доступ к поиску Google, просто набрав http://74.125.224.211 , потому что это IP-адрес, возвращаемый nslookup.

Однако я не мог сделать это с IP-адресами, возвращенными с www.yahoo.com. Как перейти на страницу поиска Yahoo по IP?

Другой пример, http://www.allaboutcircuits.com разрешит до 68.233.243.63 DNS-сервером, но если я перейду на http://68.233.243.63 , я получу «Привет мир!».

Во-вторых, по какой-то причине что-то не так с DNS-распознавателями с моей службой веб-хостинга (это не будет исправлено !!). Так что команды вроде

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

вернет php_network_getaddresses: getaddrinfo failed: Name or service not known

Как мне обойти это с IP-адресом,

68.233.243.63

Я имею в виду, каким-то образом прикрепить параметр HTTP hostname к get_file_contents()?

Я хотел бы решить эту проблему со своей стороны (в моем коде), администратор сервера не будет устранять неполадки и корректировать их.

5 ответов5

16

В вашем PHP-скрипте, когда вы обращаетесь к нему по IP-адресу, вам также необходимо отправить заголовок Host: в вашем запросе с правильным доменным именем.

Этот вопрос о переполнении стека объясняет, как это сделать: https://stackoverflow.com/questions/356705/how-to-send-a-header-using-a-http-request-through-a-curl-call

10

Как сказал wallyk, это виртуальные серверы

Возьми этот пример для Apache

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

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

В c:\www\example.com создайте индексный файл со словами «Hello World! example.com»

в c:\www\example2.com создайте индексный файл со словами «Hellow World! example2.com»

И измените свой файл hosts на

127.0.0.1 example.com
127.0.0.1 example2.com

Затем перейдите на http://example.com, затем перейдите на http://example2.com

Так вот, как вы можете иметь несколько сайтов на один IP

Так что в основном ответ таков: нет, вы не сможете получить этот сайт с ip.

5

Вы говорите, что хотите вручную указать имя хоста и IP-адрес вместо того, чтобы полагаться на DNS-сервер, находящийся вне вашего контроля. Глядя на комментарии к документации file_get_contents, я вижу, что комментаторы решили аналогичные проблемы, создав контекст, содержащий необходимый заголовок Host:. Что-то вроде этого:

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

Конечно, имейте в виду, что недостатком ручного указания имени хоста и IP-адреса является то, что если в будущем IP-адрес изменится (например, если сайт переходит на нового хостинг-провайдера), ваш код может перестать работать до Вы вручную обновляете IP-адрес.

2

Одного IP-адреса недостаточно, чтобы однозначно определить, на какой сайт вы хотите перейти, когда несколько виртуальных хостов работают на одном порту / сервере. В этом случае вам нужно указать заголовок Host в HTTP-запросе, который идентифицирует имя сервера. Вы можете сделать это напрямую через telnet к порту 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

где вы вводите команду telnet, строки GET и Host, а затем получаете исходный код HTML, возвращаемый с сервера.

Или вы можете использовать curl, где вы специально добавляете заголовок (с флагом -H ).

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

Во-вторых, по какой-то причине что-то не так с DNS-распознавателями с моим веб-хостингом (это не будет исправлено !!)

Вы можете использовать другой DNS-сервер на стороне клиента, если это не веб-хостинг - 8.8.8.8 и 8.8.8.6 работают под управлением Google, а 4.4.4.2 является обычным резервом. Namebench позволит вам найти самый быстрый. В качестве альтернативы, вы можете использовать какой-либо прокси-сервис (я запускаю свой собственный на VPS или использую Tor, но есть и другие варианты).

Поскольку это PHP, еще более простой вариант - запустить код в другой системе. Кладжес не подлежит ремонту.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .