открыть сокет на общем хосте - PullRequest
4 голосов
/ 21 июля 2011

Я пытаюсь открыть сокет на хосте, используя следующий код:

$timeout = 10;
$s = stream_socket_client('mywebsite.com:80', $errcode, $errstring, $timeout);
$message = "GET /index.php HTTP/1.0\r\n\r\n";
fwrite($s, $message);
while(!feof($s)){
    echo fread($s, 1024);
}

Ничего особенного, просто пример, который я нашел. Проблема в том, что каждый раз, когда я запускаю код, я получаю разные файлы. Я думаю, что это потому, что хост является общим.

Есть ли способ преодолеть эту проблему, то есть надежно вытащить нужный файл, который я пытаюсь получить?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 21 июля 2011

в HTTP-запросе вы должны указать, к какому хосту вы обращаетесь. как вы правильно заметили, несколько записей DNS могут указывать на один и тот же IP-адрес.

$message = "GET /index.php HTTP/1.1\r\nHost: hostname.com\r\n\r\n";
1 голос
/ 21 июля 2011

Вам необходимо отправить заголовок Host, чтобы указать имя домена - для одного сервера очень распространено размещение нескольких сайтов:

$message = "GET /index.php HTTP/1.1\r\nHost: www.example.com\r\n\r\n";

Обратите внимание (как указывает @ Darhazer ), что заголовок запроса Host определяется только с HTTP / 1.1, поэтому его нельзя использовать с HTTP / 1.0. Есть возможность использовать абсолютный URL, как в

$message = "GET http://www.example.com/index.php HTTP/1.0\r\n\r\n";

но это нарушение HTTP / 1.0 :

Форма absoluteURI разрешена только при отправке запроса к прокси.

и целевой сервер, по-видимому, не является прокси-сервером, поэтому полученное поведение ненадежно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...