HTTP заголовки запроса

Автор: teanic Дата: 25.10.2003 22:38 На запрос к своему серверу GET [gertz.ru] HTTP/1.1\r \r Host: gertz.ru\r вместо документа получаю Bad request нет имени хоста. Долго мытарился по этой проблеме, но успеха не добился. Кому интересно, может ниже почитать, но большая благодарность, кто поможет разобраться.

Подробнее...
Что-то у меня сервера не понимают моих http заголовков. Я делал
попытки с помощью PHP скрипта отправлять запросы и получать ответы
сервера. Для этого написал прогу.
<?php

//возмем мой сайт, чтобы других не трогать, и точно знать, что такие
файлы есть
$host="gertz.ru";
$path="/index.htm";

//Для установления соединения воспользуемся функцией fsockopen
$fp = fsockopen("$host", 80, &$errno, &$errdest);
if ( ! $fp)
die (" Не могу соединиться с $host: Ошибка: $errno Описание: $errdesc";-);
else print "sock is open";
//Практика показывает, что соединение устанавливается без проблем

// Составим строку запроса
$request = "GET [$host$path] HTTP/1.0\r \r Host: $host\r ";

// Отправим запрос серверу
fputs($fp, $request);

// Определим переменную куда будем считывать ответ сервера, прочитаем
ответ и закроем соединение
$page = array();

while ( ! feof($fp))
$page[] = fgets( $fp, 1024);
fclose($fp);

//Распечатаем полученный результат
print " Сервер прислал". (count($page))." строк!";

foreach ($page as $val) print $val;


?>
Программа успешно работает и выдает заголовки ответа сервера и
страницу.
Пробуем получить файл по умолчанию присвоив переменной $path="";
Программа успешно работает.
Пробуем получить первую страницу Яндекса $host="yandex.ru; $path="";
ПОЛУЧАЕМ ОШИБКУ 404
Почему если перейти от протокола HTTP/1.0 к HTTP/1.1 и в соответствии
с RFC2068 отправить запрос $request = "GET $path HTTP/1.1\r \r Host: $host\r ";
То получим ответ сервера, что URL в запросе неправильный.
Следующие строки запросов, написанные скорее от безысходности, чем по
здравому смыслу, тоже приведут к ошибкам.

$request = "GET $host$path HTTP/1.1\r \r Host: $host\r "; //Не
указано имя хоста
$request = "GET [$host$path] HTTP/1.1\r \r Host: $host\r ";
//Не указано имя хоста
Если возможно укажите, что я делаю неправильно
С уважением Сергей

--
Re: HTTP заголовки запроса 26.10.2003 00:25Neuronix Точно не помню, но попробуй использовать вместо \r - . Может поможет.
Re: HTTP заголовки запроса 26.10.2003 14:51lenni \r \r (aka 2 раза Enter) должно идти 1 раз _после_всех_ заголовков, обычные строки запроса разделяются \r

руками телнетом эмулируем
[lenni@home lenni]$ telnet gertz.ru 80
Trying 194.67.173.243...
Connected to gertz.ru.
Escape character is '^]'.
GET / HTTP/1.1
Host: gertz.ru

HTTP/1.1 200 OK
Date: Sun, 26 Oct 2003 11:44:10 GMT
Server: Apache/1.3.26 (Unix) PHP/4.2.2 PHP/3.0.18 rus/PL30.15
Content-Length: 14957
Last-Modified: Thu, 28 Aug 2003 05:49:27 GMT
ETag: "3358eb-3a6d-3f4d97e7-koi8-r"
Content-Type: text/html; charset=koi8-r
Vary: accept-charset, user-agent

...
далее следует тело ответа
Re: HTTP заголовки запроса 26.10.2003 16:57Light ---
$request = "HEAD $path HTTP/1.0 "
или
$request = "GET $path HTTP/1.1 "
или
...
---
В запросе ненужно указывать URL сервера, а нужно только относительный путь
Re: HTTP заголовки запроса 26.10.2003 17:40teanic Не помогло
Re: HTTP заголовки запроса 26.10.2003 17:46teanic Спасибо, может действительно какие-то проблемы в концах строк, но после запроса GET два конца строки иначе сервер виснет с ответом. Короче пробовал и так и этак, какая-то заморочка, а обратиться мне нужно программно, пишу тут один скрипт.
Re: HTTP заголовки запроса 26.10.2003 17:49lenni telnet-сессия нормально отрабатывает?
то же самое пишите и php-скрипте

$request="GET / HTTP/1.1\r ";
$request.="Host: ya.ru\r \r "

p.s. RFC на http-1.0 морально устарел, большинство серверов успешно работают на 1.1 (rfc2616)
Re: HTTP заголовки запроса 26.10.2003 17:52teanic Спасибо, если бы так просто все было... Там по RFC2068 возможно три формата записи, с относительным путем - один из них, и я его как видно из моего сообщения пробовал с фатальным результатом. Тут какая-то примитивная заморочка.
Re: HTTP заголовки запроса 26.10.2003 18:03teanic Возьмем ya.ru и запрос в точности как у вас
Получаю ответ:
sock is open Сервер прислал20 строк!
HTTP/1.1 400 Bad Request Date: Sun, 26 Oct 2003 14:57:17 GMT Server: Apache/1.3.6 (Unix) PHP/4.0.1pl2 mod_perl/1.19 rus/PL28.15 Connection: close Transfer-Encoding: chunked Content-Type: text/html 12e
Bad Request
Your browser sent a request that this server could not understand.
client sent HTTP/1.1 request without hostname (see RFC2068 section 9, and 14.23): /

0
Телнет в моей локалке запрещен на прокси сервере. Для справки прилагаю код скрипта
<html>

<head>
<title></title>
</head>

<body>

<?php

//возмем мой сайт, чтобы других не трогать, и точно знать, что такие файлы есть
$host="ya.ru";
//$path="/index.htm";

//Для установления соединения воспользуемся функцией fsockopen
$fp = fsockopen("$host", 80, &$errno, &$errdest);
if ( ! $fp)
die (" Не могу соединиться с $host: Ошибка: $errno Описание: $errdesc";-);
else print "sock is open";
//Практика показывает, что соединение устанавливается без проблем

// Составим строку запроса
$request = "GET / HTTP/1.1\r Host: ya.ru\r \r ";

// Отправим запрос серверу
fputs($fp, $request);

// Определим переменную куда будем считывать ответ сервера, прочитаем ответ и закроем соединение
$page = array();

while ( ! feof($fp))
$page[] = fgets( $fp, 1024);
fclose($fp);

//Распечатаем полученный результат
print " Сервер прислал". (count($page))." строк!";

foreach ($page as $val) print $val;


?>


</body>

</html>
Re: HTTP заголовки запроса 26.10.2003 19:25lenni код выглядит вроде правильно, не тестировал

несколько я понял вашу задачу - лучше использовать нативные php-функции

если php > 4.3.0
$content=file_get_contents("[ya.ru];-);
возвращает содержимое страницы в строковую переменную $content

php < 4.3.0
$content=file("[ya.ru];-);
возвращает массив

php сам все откроет-прочитает-закроет:-)

p.s. я лично предпочитаю file_get_contents
Re: HTTP заголовки запроса 26.10.2003 22:27teanic Спасибо! Так оно работает, я проверил, хотя таких функций не знал. Но остается вопрос, как писать диалог с сервером, если он посылает куку. Хотелось полностью смоделировать работу броузера
Re: HTTP заголовки запроса 26.10.2003 23:02lenni php > 4.3.0
apache_response_headers()
возвращает массив, разбираете его

есть смысл покопаться на [phpclasses.org] или на [pear.php.net]- может найдется класс какой готовый
RSS-материал