Автор Тема: Заголовки HTTP/1.1  (Прочитано 6022 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн teanic

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gertz.ru
Заголовки HTTP/1.1
« : 27 Октября 2003, 19:04:57 »
На запрос к своему серверу GET http://gertz.ru/index.htm HTTP/1.1\\r\\n\\r\\nHost: gertz.ru\\r\\n вместо документа получаю Bad request нет имени хоста. Долго мытарился по этой проблеме, но успеха не добился. Кому интересно, может ниже почитать, но большая благодарность, кто поможет разобраться.

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

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

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

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

// Отправим запрос серверу
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\\n\\r\\nHost: $host\\r\\n";
То получим ответ сервера, что URL в запросе неправильный.
Следующие строки запросов, написанные скорее от безысходности, чем по
здравому смыслу, тоже приведут к ошибкам.

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

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Заголовки HTTP/1.1
« Ответ #1 : 27 Октября 2003, 22:09:43 »
попробуй
GET $path HTTP/1.1\\r\\n
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн teanic

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gertz.ru
Заголовки HTTP/1.1
« Ответ #2 : 28 Октября 2003, 10:20:43 »
Пробовал, в этом случае сервер просто не дает ответа
Я перед этим форумом толкался у линуксоидов, они тоже с этого совета начинали. Если интересно, то вот ссылка  http://community.asplinux.ru/forum/1/13924/13945/ Может кто знает более специализированный форум?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Заголовки HTTP/1.1
« Ответ #3 : 28 Октября 2003, 10:35:57 »
гыыыыыыыыыыыыыыыыыыыыыыыыыы :-)))))))))
посмотрел внимательнее :-))))

Макс, посмотри и ты
GET http://gertz.ru/index.htm HTTP/1.1\\r\\n\\r\\nHost  gertz.ru\\r\\n

Вопрос.
Чем у нас отделяется заголовок от тела запроса?

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Заголовки HTTP/1.1
« Ответ #4 : 28 Октября 2003, 11:39:24 »
RomikChef
да уж, проглядел.

teanic
насчет того, что сервер не дает ответа, попробуй слать в запросе еще
Connection: close
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн teanic

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gertz.ru
Заголовки HTTP/1.1
« Ответ #5 : 28 Октября 2003, 14:53:27 »
Не полегчало. Ответ сервера
sock is open Сервер прислал20 строк!HTTP/1.1 400 Bad Request Date: Tue, 28 Oct 2003 11:50:58 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

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Заголовки HTTP/1.1
« Ответ #6 : 28 Октября 2003, 15:36:13 »
лучше HTTP-запрос покажи.
Кстати RFC2068 section 9, and 14.23 читал ?
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Заголовки HTTP/1.1
« Ответ #7 : 28 Октября 2003, 16:21:20 »
убери из своего "запроса" ВСЕ переводы строк. все до единого.

Оффлайн teanic

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gertz.ru
Заголовки HTTP/1.1
« Ответ #8 : 28 Октября 2003, 21:01:26 »
В русском переводе RFC2068 в частности секция 9 приведены http://www.kuzbass.ru/docs/http/1.1/rus/section-9.html Я действую (как мне кажется) в строгом соответствии со стандартом.

Если убрать концы строк, то сокет открывается заголовок отправляется, а сервер молчит и скрипт прекращается по прерыванию времени
sock is open
Fatal error: Maximum execution time of 30 seconds exceeded in z:\\home\\atw\\www\\page_analyser2.php on line 32

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Заголовки HTTP/1.1
« Ответ #9 : 28 Октября 2003, 21:47:42 »
А, ты в сокет кладешь.
я с хидером перепутал.
ну тогда в конце два перевода поставь.
Только в конце, а не в середине.
У тебя там в твоем эрэфце не написано, что два перевода строки означают конец заголовков?

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Заголовки HTTP/1.1
« Ответ #10 : 28 Октября 2003, 21:57:53 »
teanic
повторяю, ПОКАЖИ ТЕКСТ HTTP-ЗАПРОСА
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн teanic

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gertz.ru
Заголовки HTTP/1.1
« Ответ #11 : 29 Октября 2003, 11:38:05 »
Во-первых, спасибо за внимание и терпение в разборе этого вопроса всем участникам.
Во-вторых,  Отденльная благодарность RomikChef, его следут признать победителем двух конференций.
Прилагаю также сам эрфс в котором к сожалению про концы строк пишут непонятно.  CLRF это, по-моему, один конец строки. Хотя в статьях про заголовки я читал, что заголовок запроса от тела должен отделяться двумя переводами. Даже я это уже пробовал, но видимо что-то было не так. И когда уже в многократный раз перенабил запрос, то получил правильный результат.


5 Запрос (Request).
Сообщение запроса от клиента к серверу содержит в первой строке: метод, который нужно применить к ресурсу, идентификатор ресурса и используемую версию протокола.

           Request       = Request-Line              ; Раздел 5.1
                           *( general-header         ; Раздел 4.5
                            | request-header         ; Раздел 5.3
                            | entity-header )        ; Раздел 7.1
                           CRLF
                           [ message-body ]          ; Раздел 7.2

5.1 Строка запроса (Request-Line).
Строка запроса (Request-Line) начинается с лексемы метода, затем следует запрашиваемый URI (Request-URI), версия протокола и CRLF. Эти элементы разделяются SP. В строке запроса (Request-Line) не допустимы CR и LF, исключение составляет конечная последовательность CRLF.

          Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

5.1.1 Метод (Method).
Лексема метода указывает метод, который нужно применить к ресурсу, идентифицированному запрашиваемым URI (Request-URI). Метод чувствителен к регистру.

          Method         = "OPTIONS"                ; Раздел 9.2
                         | "GET"                    ; Раздел 9.3
                         | "HEAD"                   ; Раздел 9.4
                         | "POST"                   ; Раздел 9.5
                         | "PUT"                    ; Раздел 9.6
                         | "DELETE"                 ; Раздел 9.7
                         | "TRACE"                  ; Раздел 9.8
                         | extension-method

          extension-method = token

Список методов, применимых к ресурсу, может быть указан в поле заголовка Allow (раздел 14.7). Возврашаемый код состояния ответа всегда сообщает клиенту, допустим ли метод для ресурса в настоящее время, так как набор допустимых методов может изменяться динамически. Серверам СЛЕДУЕТ возвратить код состояния 405 (Метод не дозволен, Method Not Allowed), если метод известен серверу, но не применим для запрошенного ресурса, и 501 (Не реализовано, Not Implemented), если метод не распознан или не реализован сервером. Список методов, известных серверу, может быть указан в поле заголовка ответа Public (раздел 14.35).

Методы GET и HEAD ДОЛЖНЫ поддерживаться всеми универсальными (general-purpose) серверами. Остальные методы опциональны; однако, если вышеупомянутые методы реализованы, то они ДОЛЖНЫ иметь семантику, описанную в разделе 9.

5.1.2 Запрашиваемый URI (Request-URI).
Запрашиваемый URI (Request-URI) - это Единообразный Идентификатор Ресурса (URL, раздел 3.2), который идентифицирует ресурс запроса.

          Request-URI    = "*" | absoluteURI | abs_path

Три опции для запрашиваемого URI (Request-URI) зависят от характера запроса. Звездочка "*" означает, что запрос обращается не к специфическому ресурсу, а к серверу непосредственно, и допускается только в том случае, когда используемый метод не обязательно обращается к ресурсу. В качестве примера:

          OPTIONS * HTTP/1.1


absoluteURI необходим, когда запрос производится через прокси-сервер. Прокси-сервер перенаправляет запрос на сервер или обслуживает его, пользуясь кэшем, и возвращает ответ. Обратите внимание, что прокси-сервер МОЖЕТ переслать запрос другому прокси-серверу или непосредственно серверу, определенному absoluteURI. Чтобы избежать зацикливания запроса прокси-сервер ДОЛЖЕН быть способен распознавать все имена сервера, включая любые псевдонимы, локальные разновидности, и числовые IP адреса. Request-Line может быть, например, таким:

          GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1


Чтобы обеспечить переход к absoluteURI во всех запросах в будущих версиях HTTP, все HTTP/1.1 серверы ДОЛЖНЫ принимать absoluteURI в запросах, хотя HTTP/1.1 клиенты будут генерировать их только в запросах к прокси-серверам.

Наиболее общая форма Request-URI - та, которая используется для идентификации ресурса на первоначальном сервере или шлюзе. В этом случае абсолютный путь URI (смотрите раздел 3.2.1, abs_path) ДОЛЖЕН быть передан как Request-URI, а сетевое расположение URI (net_loc) ДОЛЖНО быть передано в поле заголовка Host. Для последнего примера клиент, желающий получить ресурс непосредственно с первоначального сервера должен создать TCP соединение на 80 порт хоста "www.w3.org" и послать строки:

          GET /pub/WWW/TheProject.html HTTP/1.1
          Host: http://www.w3.org

и далее остаток запроса. Обратите внимание, что абсолютный путь не может быть пустым; если оригинальный URI пуст, то он ДОЛЖЕН запрашиваться как "/" (корневой каталог сервера).

Если прокси-сервер получает запрос без пути в Request-URI, и метод запроса допускает форму запроса "*", то последний прокси-сервер в цепочке запросов ДОЛЖЕН передать запрос, в котором Request-URI равен "*". Например запрос

          OPTIONS http://www.ics.uci.edu:8001 HTTP/1.1

был бы передан прокси-сервером в виде
          OPTIONS * HTTP/1.1
          Host: http://www.ics.uci.edu:8001

после соединения с портом 8001 хоста "www.ics.uci.edu".

Request-URI передается в формате, определенном в разделе 3.2.1. Первоначальный сервер ДОЛЖЕН декодировать Request-URI, чтобы правильно интерпретировать запрос. Серверам СЛЕДУЕТ отвечать на недопустимые Request-URI соответствующим кодом состояния.

В запросах, которые передаются далее, прокси-сервера никогда НЕ ДОЛЖНЫ перезаписывать часть "abs_path" запрашиваемого URI (Request-URI), за исключением случая, отмеченного выше, когда пустой abs_path заменяется на "*", независимо от внутренней реализации прокси-сервера.

Обратите внимание: правило "ничто не перезаписывать" предохраняет прокси-сервера от изменения значения запроса, в котором первоначальный сервер неправильно использует не зарезервированные символы URL для своих целей. Реализаторам следует знать, что некоторые до-HTTP/1.1 прокси-сервера, как известно, перезаписывали Request-URI.

5.2 Ресурс, идентифицируемый запросом.
Первоначальные HTTP/1.1 сервера ДОЛЖНЫ учитывать, что точный ресурс, идентифицированный интернет-запросом определяется исследованием как Request-URI, так и поля заголовка Host.

Первоначальный сервер, который не позволяет ресурсам отличаться по запрошенному хосту (host), МОЖЕТ игнорировать значение поля заголовка Host. (Но смотрите раздел 19.5.1 для других требований по поддержке Host в HTTP/1.1).

Первоначальный сервер, который различает ресурсы, основанные на запрошенном хосте (иногда называемые виртуальными хостами или vanity hostnames) ДОЛЖЕН использовать следующие правила для определения запрошенного в HTTP/1.1 запросе ресурса:

Если Request-URI - это absoluteURI, то хост - это часть Request-URI. Любое значение поля заголовка Host в запросе ДОЛЖНО игнорироваться.
Если Request-URI - не absoluteURI, а запрос содержит поле заголовка Host, то хост определяется значением поля заголовка Host.
Если хоста, определенного правилами 1 или 2 не существует на сервере, код состояния ответа ДОЛЖЕН быть 400 (Испорченный Запрос, Bad Request).
Получатели HTTP/1.0 запроса, в котором недостает поля заголовка Host, МОГУТ пытаться использовать эвристику (например, исследовать путь в URI на предмет уникальности на каком-либо из хостов) чтобы определить какой точно ресурс запрашивается.

5.3 Поля заголовка запроса.
Поля заголовка запроса позволяют клиенту передавать серверу дополнительную информацию о запросе и о самом клиенте. Эти поля действуют как модификаторы запроса с семантикой, эквивалентной параметрам вызова методов в языках программирования.

          request-header = Accept                   ; Раздел 14.1
                         | Accept-Charset           ; Раздел 14.2
                         | Accept-Encoding          ; Раздел 14.3
                         | Accept-Language          ; Раздел 14.4
                         | Authorization            ; Раздел 14.8
                         | From                     ; Раздел 14.22
                         | Host                     ; Раздел 14.23
                         | If-Modified-Since        ; Раздел 14.24
                         | If-Match                 ; Раздел 14.25
                         | If-None-Match            ; Раздел 14.26
                         | If-Range                 ; Раздел 14.27
                         | If-Unmodified-Since      ; Раздел 14.28
                         | Max-Forwards             ; Раздел 14.31
                         | Proxy-Authorization      ; Раздел 14.34
                         | Range                    ; Раздел 14.36
                         | Referer                  ; Раздел 14.37
                         | User-Agent               ; Раздел 14.42

Имена полей заголовка запроса (Request-header) могут быть надежно расширены только в сочетании с изменением версии протокола. Однако, новые или экспериментальные поля заголовка могут получить семантику полей заголовка запроса (Request-header), если все стороны соединения распознают их как поля заголовка запроса (Request-header). Нераспознанные поля заголовка обрабатываются как поля заголовка объекта (entity-header).

Как видно из эрфс про двойной конец строки речи небыло

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Заголовки HTTP/1.1
« Ответ #12 : 29 Октября 2003, 12:05:22 »
Цитировать
teanic:
CLRF это, по-моему, один конец строки.

по-моему - тоже
а CLRFCLRF - два.

И я рад, что тв, в конце концов, убрал лишние переводы из своих заголовков, и у тебя все плучилось.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28