Как перейти на сайт на общем сервере по его IP-адресу?


18

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

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

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

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

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

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

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

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

68.233.243.63

Я имею в виду, как-то присоединить параметр имени хоста HTTP к get_file_contents()?

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


9
Прочитайте о виртуальных серверах и о том, как один хост может размещать множество веб-сайтов.
Wallyk

Я полагаю, есть какая-то причина, по которой вы не можете просто использовать доменное имя?
Исаак Рабинович

@Isaac Rabinovitch: user1502776 говорит: «Что-то не так с DNS-распознавателями в моей службе веб-хостинга (это не будет исправлено !!)» и «Я хотел бы решить эту проблему самостоятельно (в моем коде), устранение неполадок не выполняется / Настройка будет выполнена администратором сервера. "
Bavi_H

3
Если администратор вашего сервера настолько глуп, вам нужно найти другого провайдера веб-хостинга.
Майкл Хэмптон

Ответы:


16

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

Этот вопрос о переполнении стека объясняет, как это сделать: /programming/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.


Я понимаю, что одного IP недостаточно. Но есть ли какая-нибудь команда PHP, которая использует IP и имя хоста, которые я предоставляю для извлечения удаленных веб-страниц? Команда не должна запрашивать DNS.
user1502776

4
Хотя это может быть технически точным, это не решает вопрос. Вопрос заключается в том, как запросить конкретный сайт с известным именем хоста на сервере с известным IP-адресом без автоматического разрешения IP-адреса через DNS с помощью сценария PHP. Он не спрашивает, как найти имя хоста, соответствующее данному IP. Комментарий wallyk более актуален, потому что его ссылка включает в себя информацию о Hostзаголовке, необходимую для того, чтобы сервер различал веб-сайты, которые он размещает, и обслуживал правильный.
Боб

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, еще более простой вариант - запустить код в другой системе. Кладжес не подлежит ремонту.


Похоже, он находится на каком-то общем хосте и не может изменить DNS, поэтому у него есть предостережение: «Я хотел бы решить эту проблему самостоятельно (в моем коде), администратор сервера не будет выполнять никаких действий по устранению неполадок / настройке. " Я не думаю, что он может изменить DNS. , ,
Эрни

1
Он может использовать альтернативный DNS-сервер на стороне клиента для тестирования. Если его веб-хостинг не настраивает vhosts должным образом, ему нужен другой веб-хостинг.
Подмастерье Компьютерщик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.