|
видно, если
вы
собираетесь использовать заголовок Location, то никакого документа выводить не
надо.
Рекомендуется всегда указывать в заголовке Location абсолютный путь вме-
сте с именем хоста, а не относительный. Дело в том, что, как показывает прак-
тика, не все браузеры правильно реагируют на относительные пути и вытво-
ряют все, что им заблагорассудится.
В браузере Netscape имеется ошибка, проявляющаяся, когда сценарий выво-
дит заголовок Location с указанием перейти на собственный URL (то есть,
сам на себя, для этого даже придуман специальный термин — self-redirect).
Такое решение не так бесполезно, как кажется, и используется, например, в
гостевых книгах. В этом случае Netscape прекрасно принимает ответ сценария,
но затем почему-то сообщает о том, что "документ не содержит данных". Как
решить указанную проблему, см. в части V книги.
Set-cookie
Формат: Set-cookie: параметры_cookie
Устанавливает Cookie в браузер пользователя. Позже в этой главе мы рассмотрим
подробнее, что такое Cookies и как с ними работать.
Date
Формат: Date: Sat, 08 Jan 2000 11:56:26 GMT
Указывает браузеру дату отправки документа.
Часть I. Основы Web-программирования 46
Server
Формат: Server: Apache/1.3.9 (Unix) PHP/3.0.12
Устанавливается сервером и указывает браузеру тип сервера и другую информацию о
серверном программном обеспечении.
Пример CGI-сценария
Настало время привести небольшой сценарий на Си, который иллюстрирует некото-
рые возможности, которые были описаны выше (листинг 3.1).
Листинг 3.1. Простейший сценарий script.c
#include // Нужна для инициализации функции rand()
#include // Включаем поддержку функций ввода/вывода
#include // А это — для поддержки функции rand()
// Главная функция. Именно она и запускается при старте сценария.
void main(void) {
// инициализируем генератор случайных чисел
int Num; time_t t; srand(time(&t));
// в Num записывается случайное число от 0 до 9
Num = rand()%10;
// далее выводим заголовки ответа. Тип — html-документ
printf("Content-type: text/html\n");
// запрет кэширования
printf("Pragma: no-cache\n");
// пустой заголовок
printf("\n");
// выводим текст документа — его мы увидим в браузере
printf("");
printf("Здравствуйте!");
printf("Случайное число в диапазоне 0-9: %d",Num);
printf("");
}
Исходный текст можно откомпилировать и поместить в каталог с CGI-сценариями на
сервере. Обычно стараются все сценарии хранить в одном месте — в каталоге
cgibin,
у которого имеется разрешение на выполнение всех файлов внутри него. Правда,
это правило не является обязательным — конечно же, можно разместить файлы сце-
нария где душе угодно (не забыв проставить соответствующие права на каталог в
на-
Глава 3. CGI изнутри 47
стройках сервера). На мой взгляд, логично хранить файлы сценариев там, где это
наиболее вам удобно, а не пользоваться общепринятыми штампами. Теперь наберем
в адресной строке браузера:
http://www.myhost.com/cgi-bin/script.cgi
Мы получим нашу HTML-страницу. Заметьте, что при нажатии Reload
(а также при повторном посещении страницы) браузер перезагрузит страницу цели-
ком, а не возьмет ее копию из своего кэша (это можно видеть по постоянно изме-
няющемуся случайному числу или по лампочкам модема). Мы добились такого ре-
зультата благодаря заголовку
Pragma: no-cache
Давайте теперь посмотрим, что нужно изменить в нашем сценарии, чтобы его вывод
представлял из себя с точки зрения браузера не HTML-документ, а рисунок. Пусть
нам нужен сценарий, который бы передавал пользователю какой-то GIF-рисунок (на-
пример, выбираемый случайным образом из некоторого списка). Делается это абсо-
лютно аналогично: выводим заголовок
Content-type
|
|