|
Передача документа
пользователю
Вначале рассмотрим более простой вопрос: как программа посылает свой ответ (то
есть документ) пользователю.
А сделано это просто и логично (а главное, универсально и переносимо между
опера-
ционными системами): сценарий просто помещает документ в стандартный поток
вывода (на Си он называется stdout), который находится под контролем программ-
ного обеспечения сервера. Иными словами, программа работает так, как будто нет
никакого пользователя, а нужно вывести текст прямо на "экран". (Это она так
думает,
на самом деле выводимая информация будет перенаправлена сервером в браузер
пользователя. Ясно, что у сценария никакого "экрана" нет и быть не может.)
Ответ программы, как и запрос пользователя, должен состоять из заголовков.
Иными
словами, мы не можем просто направить документ в стандартный поток вывода: нам
сначала нужно по крайней мере указать, в каком формате информация должна быть
передана пользователю. Действительно, представьте, что произойдет, если браузер
попытается отобразить GIF-рисунок в текстовом виде? В худшем случае вашим поль-
зователям придется всю жизнь лечиться от заикания — особенно если до этого их
просили ввести номер кредитной карточки.…
Заголовки ответа
Заголовки ответа должны следовать точно в таком же формате, как и заголовки за-
проса, рассмотренные нами в предыдущей главе. А именно, это набор строк (завер-
шающийся пустой строкой), каждая из которых представляет собой имя заголовка и
Часть I. Основы Web-программирования 44
его значение, разделенные двоеточием. Наличие пустого заголовка в конце также
можно интерпретировать как два стоящих подряд обозначения \n\n. Затем, как
обычно, могут следовать данные ответа, которые и являются документом, который
будет отображен браузером.
Заголовок кода ответа
Однако здесь все же имеется одно отличие от формата, который используется в
заго-
ловках запроса. Дело в том, что первый заголовок ответа обязан иметь слегка
специ-
фичный вид — в нем не должно быть двоеточия. Он задает так называемый код от-
вета сервера и выглядит, например, так:
HTTP/1.1 OK
или так:
HTTP/1.1 404 File Not Found
В первом примере заголовок говорит браузеру, что все в порядке и дальше следует
некоторый документ. Во втором примере сообщается, что затребованный файл не был
найден на сервере. Конечно, существует еще множество других кодов ошибок, но
для
нас они не представляют особого интереса, и вот почему.
Чаще всего (за исключением редких случаев) браузеры не обращают особого внима-
ния на заголовок кода ответа, а просто выводят следующий за ним документ. Кроме
того, такой заголовок формируется сервером, а в сценарии мы никак не можем его
изменить (правда, есть специальный заголовок Status, но мы не будем здесь о нем
говорить). Поэтому я и не рассматриваю подробно этот вопрос в данной книге.
Вот другие наиболее распространенные заголовки ответа.
Content-type
r Формат: Content-type: mime_тип; charset=koi8-r
Задает тип документа и его кодировку. Параметр charset задает кодировку доку-
мента (в нашем примере это KOI8-R). Поле mime_тип определяет тип информации,
которую содержит документ:
r text/html — HTML-документ;
r text/plain — простой текстовый файл;
r image/gif — GIF-изображение;
r image/jpeg — JPG-изображение;
r еще несколько десятков других типов.
Pragma
Формат: Pragma: no-cache
Глава 3. CGI изнутри 45
Запрещает кэширование документа браузером, так что при повторном визите на
страницу браузер гарантированно загрузит ее снова, а не извлечет из своего кэша.
Это может быть полезно, если страница содержит, например, динамический счетчик
посещений.
Заголовок Pragma используется также и для других целей (и соответственно, после
двоеточия находятся другие значения строки), но мы не будем их здесь рассматри-
вать.
Location
Формат: Location: http://www.otherhost.com/somepage.html
Этот заголовок особенный и определяет, что браузер пользователя должен
немедлен-
но перейти по указанному адресу, не дожидаясь тела документа ответа (как будто
бы
пользователь сам набрал в адресной строке нужный URL). Так что, оч
|
|