РНР 5 в подлиннике

Страница 38 из 554


78

Часть I. Основы Web-программирования

Ваша цель — создать исполняемый файл script.exe. Дальше его можно при желании переименовать в script.cgi (сервер Apache, рассматриваемый в следующей главе, это допускает) и использовать в качестве готового сценария.

Передача документа пользователю

Вначале рассмотрим более простой вопрос, как программа посылает свой ответ (т. е. документ) пользователю.

А сделано это просто и логично (а главное, универсально и переносимо между операционными системами): сценарий просто помещает документ в стандартный поток вывода (в языке С он называется stdout), который находится под контролем программного обеспечения сервера. Иными словами, программа работает так, как будто нет никакого пользователя, а нужно вывести текст прямо на экран. (Это она так думает, на самом деле выводимая информация будет перенаправлена сервером в браузер пользователя. Ясно, что у сценария никакого "экрана" нет и быть не может.)

Ответ программы, как и запрос пользователя, должен состоять из заголовков. Иными словами, мы не можем просто направить документ в стандартный поток вывода: нам сначала нужно, по крайней мере, указать, в каком формате информация должна быть передана пользователю. Действительно, представьте, что произойдет, если браузер попытается отобразить GIF-рисунок в текстовом виде? В худшем случае вашим пользователям придется всю жизнь лечиться от заикания — особенно если до этого их просили ввести номер кредитной карточки...

Заголовки ответа

Заголовки ответа должны следовать точно в таком же формате, как и заголовки запроса, рассмотренные нами в предыдущей главе. А именно, это набор строк (завершающийся пустой строкой), каждая из которых представляет собой имя заголовка и его значение, разделенные двоеточием. Наличие пустого заголовка в конце так же можно интерпретировать, как два стоящих подряд обозначения \п\п. Затем, как обычно, могут следовать данные ответа, являющиеся документом, который будет отображен браузером.

Заголовок кода ответа

Здесь все же имеется одно отличие от формата, который используется в заголовках запроса. Дело в том, что первый заголовок ответа обязан иметь слегка специфичный вид — в нем не должно быть двоеточия. Он задает так называемый код ответа сервера и выглядит, например, так:

HTTP/1.1 OK

или так:

НТТР/1.1 404 Not Found

В первом примере заголовок говорит браузеру, что все в порядке и дальше следует некоторый документ. Во втором примере сообщается, что затребованный файл не был найден на сервере. Конечно, существует еще множество других кодов ошибок.

Гпава 3. CGI изнутри

79

"Подделывание" заголовка ответа

При работе с некоторыми распространенными кодами ответа (404, 403 и т. д.) браузеры не обращают особого внимания на заголовок кода ответа, а просто выводят следующий за ним документ.

Внимание!

В Internet Explorer имеется одна очень неприятная особенность: если длина документа, выдаваемого вместе с кодом 404-й ошибки, не превосходит 512 байтов, браузер игнорирует его и выводит свою собственную ("белую") страницу ошибки. Если вы хотите избежать такого поведения, добавьте в свою страницу 512 пробелов или длинный HTML-комментарий той же длины.

Несмотря на то, что код ответа формируется сервером в первую очередь, еще до запуска сценария, мы можем изменить его в CGl-скрипте при помощи "фиктивного" заголовка status. Например, напечатав в скрипте

Status: 404 Not Found

мы заставим сервер послать браузеру код ответа 404, а также выполнить стандартный обработчик 404-й ошибки, если он назначен директивой Apache ErrorDocument. При этом сам заголовок status отправлен не будет — он обрабатывается сервером и после этого вырезается.

Внимание!

К сожалению, данная техника работает только в CGI-сценариях и может не работать в РНР, если последний установлен в виде модуля Apache. Про установку РНР в виде модуля и внешнего скрипта читайте в гл. 5.

Приведем другие наиболее распространенные заголовки ответа.

Content-type

Формат:

Content-type: т1те_тип; cha.rsez=koi8-r

Задает тип документа и его кодировку. Параметр charset указывает кодировку документа (в нашем примере это KOI8-R). Поле тше_тип определяет тип информации, которую содержит документ:

□ text/html — HTML-документ;

□ text/plain — простой текстовый файл;

□ image/gif — GIF-изображение;

□ image/jpeg — JPG-ИЗображение

еще несколько десятков других типов.

Pragma

Формат:

Pragma: no-cache

Запрещает кэширование документа браузером, так что при повторном визите на страницу браузер гарантированно загрузит ее снова, а не извлечет из своего кэша.




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006