Как перейти на сайт на общем сервере по его IP-адресу?
У меня есть несколько вопросов, пожалуйста, помогите:
Во-первых, я могу получить доступ к поиску 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 ответов
В вашем PHP-скрипте, когда вы обращаетесь к нему по IP-адресу, вам также необходимо отправить Host:
Заголовок в вашем запросе с правильным доменным именем.
Этот вопрос о переполнении стека объясняет, как это сделать: https://stackoverflow.com/questions/356705/how-to-send-a-header-using-a-http-request-through-a-curl-call
As wallyk said, it is virtual servers
Take this example for apache
<VirtualHost *:80>
ServerName example2.com
DocumentRoot C:/www/example2.com
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
DocumentRoot C:/www/example.com
</VirtualHost>
In c:\www\example.com make an index file saying "Hello World! example.com"
in c:\www\example2.com make an index file saying "Hellow World! example2.com"
And change your hosts file to
127.0.0.1 example.com
127.0.0.1 example2.com
Then go to http://example.com/ then go to http://example2.com/
So that is how you can have multiple sites per single ip
So basically the answer is, no you won't be able to get that site from the ip.
Вы говорите, что хотите вручную указать имя хоста и 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-адрес.
Одного 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"
Во-вторых, по какой-то причине что-то не так с DNS-распознавателями с моим веб-хостингом (это не будет исправлено !!)
Вы можете использовать другой DNS-сервер на стороне клиента, если это не веб-хостинг - 8.8.8.8 и 8.8.8.6 работают под управлением Google, а 4.4.4.2 является обычным резервом. Namebench позволит вам найти самый быстрый. В качестве альтернативы вы можете использовать какой-либо прокси-сервис (я запускаю свой собственный на VPS или использую Tor, но есть и другие варианты).
Поскольку это PHP, еще более простой вариант - запустить код в другой системе. Кладжес не подлежит ремонту.