CGI - (Common Gateway Interface - общий шлюзовой интерфейс) это набор правил, согласно которым программы на сервере могут через веб-сервер посылать данные клиентам. Формы расширяют эту возможность, позволяя клиенту посылать данные для CGI-программы.
Есть четыре способа, которыми CGI передает данные между CGI-программой и веб-сервером, а следовательно, и клиентом Web:
· Переменные окружения;
· Командная строка;
· Стандартное устройство ввода;
· Стандартное устройство вывода.
С помощью этих четырех методов сервер пересылает все данные, переданные клиентом, CGI-программе. Затем CGI-программа делает свое дело и пересылает выходные данные обратно серверу, который переправляет их клиенту.
Переменные окружения Когда сервер выполняет CGI-программу, то прежде всего передает ей некоторые данные для работы в виде переменных окружения. В спецификации официально определены семнадцать переменных, но неофициально используется значительно больше - с помощью механизма, называемого HTTP_mechanism. CGI-программа имеет доступ к этим переменным так же, как и к любым переменным среды командного процессора при запуске из командной строки. В сценарии командного процессора, например, к перем окруж FOO можно обращаться как $FOO; в Perl - $ENV{'FOO'}; в С - getenv("FOO"); и т. д.
Некоторые переменные окружения:
CONTENT LENGTH Длина данных, переданных методами POST или PUT, в байтах
CONTENT_TYPE Тип MIME данных, присоединенных с помощью методов POST или PUT.
GATEWAY_INTERFACE Номер версии спецификации CGI, поддерживаемой сервером.
PATH_INFO Дополнительная информация пути, переданная клиентом. Например, для запроса https://www.myserver.com/test.cgi/this/is/a/path?field=green значением переменной РАTH_INFO будет /this/is/a/path.
QUERY_STRING Все данные, следующие за символом «?» в URL. Это также данные, передаваемые, когда REQUEST_METOD формы есть GEТ.
|
REMOTE_ADDR IP-адрес клиента, делающего запрос.
REMOTE_HOST Имя узла машины клиента, если оно доступно.
REQUEST_METHOD Метод, используемый клиентом для запроса. Для CGI-программ, которые мы собираемся создавать, это обычно будет POST или GET.
SCRIPT_NAME Путь к выполняемому сценарию, указанный клиентом. Может использоваться при ссылке URL на самого себя, и для того, чтобы сценарии, ссылки на которые существуют в разных местах, могли выполняться по-разному в зависимости от места.
SERVER_NAME Имя узла - или IP-адрес, если имя недоступно, машины, на которой выполняется веб-сервер.
SERVER_PORT Номер порта, используемого веб-сервером.
SERVER_PROTOCOL Протокол, используемый клиентом для связи с сервером (обыч. HTTP)
SERVER_SOFTWARE Данные о версии веб-сервера, выполняющего CGI-программу.
Все эти переменные могут быть использованы и даже изменены CGI-программой. Но эти изменения не затрагивают веб-сервер, запустивший программу.
Помимо этих переменных данные, возвращаемые клиентом в заголовке запроса, присваиваются переменным вида HTTP_FOO, где FOO - имя заголовка. Например, большинство веб-броузеров включает данные о версии в заголовок с именем USER_AGENT. Ваша CGI-программа может получить эти данные из переменной HTTP_USER_AGENT.
Командная строка. CGI допускает передачу CGI-программе аргументов в качестве параметров командной строки, которая редко используется. Суть в том, что если переменная окружения QUERY_STRING не содержит символа «= », то CGI-программа будет выполняться с параметрами командной строки, взятыми из OUERY_STRING. https://www.myseruer.com/cgi-bin/finger?root запустит finger root на www.myserver.com.
|
Параметры командной строки чаще всего используются вместе с тегом HTML <ISINDEX>. Тег <ISINDEX> обозначает миниформу, содержащуюся в одном теге. Обнаружив тег <ISINDEX>, броузер выводит окно, в которое пользователь может ввести текст запроса. При подаче запроса (нажатии пользователем клавиши «Enter»), броузер извлекает URL из тега <ISINDEX> и обращается к нему, передавая текст запроса в качестве командной строки.
Стандартное устройство ввода. Eсли клиент использует для передачи информации HTTP-методы PUT или POST, длина и тип MIME этих данных помещаются в переменные CONTENT_LENGTH и CONTENT_TYPE соответственно. Передаваемые данные посылаются на стандартное устройство ввода CGI-программы. Признак конца данных может не посылаться программе, поэтому она должна взять значение переменной CONTENT_LENGTH и прочесть столько байтов, сколько в ней указано
Стандартное устройство вывода. Данные, посылаемые CGI-программой на стандартное устройство вывода, читаются веб-сервером и отправляются клиенту. Если имя сценария начинается с nph-, то данные посылаются прямо клиенту без вмешательства со стороны веб-сервера. В этом случае CGI-программа должна сформировать правильный заголовок HTTP, который будет понятен клиенту. В противном случае веб-сервер сам формирует HTTP-заголовок.
В любом случае, серверу нужно дать одну директиву, которая сообщит ему сведения о вашей выдаче. Обычно это HTTP-заголовок Content-Type, но может быть и заголовок Location. За заголовком должна следовать пустая строка, то есть перевод строки или комбинация CR/LF.
Заголовок Content-Type сообщает серверу, какого типа данные выдает CGI-программа. Если это страница HTML, то строка должна быть «Content-Type: text/html». Заголовок Location сообщает серверу другой URL или другой путь на том же сервере, куда нужно направить клиента. Заголовок должен иметь следующий вид: «Location: https:// www.myserver.com/another/place/».
|
После заголовков HTTP и пустой строки можно посылать собственно данные, выдаваемые вашей программой - страницу HTML, изображение, текст или что-либо еще.
Запоминание состояния.
HTTP является так называемым протоколом «без памяти». Это значит, что клиент посылает данные серверу, сервер возвращает данные клиенту, и дальше каждый идет своей дорогой. Сервер не сохраняет о клиенте данных, которые могут понадобиться в последующих операциях. Аналогично, нет уверенности, что клиент сохранит о совершенной операции какие-либо данные, которые можно будет использовать позднее. Всякий раз, когда запрос достигает программы CGI, это совершенно новый экземпляр программы, не имеющий связи с предыдущим.
Cookies. В части клиента с появлением Netscape Navigator появилось выглядящее наспех сделанным решение под названием cookies. Оно состоит в создании нового HTTP-заголовка, который можно пересылать туда-сюда между клиентом и сервером, похожего на заголовки Content-Type и Location. Броузер клиента, получив заголовок cookie, должен сохранить в cookie данные, а также имя домена, в котором действует этот соokie. После этого всякий раз при посещении URL в пределах указанного домена заголовок cookie должен возвращаться серверу для использования в CGI-программах на этом сервере. Метод cookie используется в основном для хранения идентификатора пользователя. Сведения о посетителе можно сохранить в файле на сервере. Уникальный ID этого пользователя можно послать в качестве cookie броузеру пользователя, после чего при каждом посещении сайта пользователем броузер автоматически посылает серверу этот ID. Сервер передает ID программе CGI, которая открывает соответствующий файл и получает доступ ко всем данным о пользователе. Все это происходит незаметно для пользователя.
Несмотря на всю полезность этого метода, большинство сайтов не использует его в качестве единственного средства запоминания состояния. Для этого есть ряд причин. Во-первых, не все броузеры поддерживают cookie. Во-вторых, что более важно, cookie привязывают пользователя к определенной машине. Одним из великих достоинств Web является то, что она доступна из любой точки света. Независимо от того, где была создана или где хранится ваша веб-страница, ее можно показать с любой подключенной к Интернет машины. Однако если вы попытаетесь получить доступ к поддерживающему cookie сайту с чужой машины, все ваши персональные данные, поддерживавшиеся с помощью cookie, будут утрачены.
Использование интерфейса в стиле «имя регистрации/пароль». Страница содержит форму, в которую пользователь вводит имя регистрации и пароль, присвоенные ему при первом посещении сайта.
Использование hidden-поля в форме. ID пользователя можно пересылать через поле hidden.
Сохранение идентификатора сеанса (с использованием URL).
Идентификатор сеанса можно добавить к адресу URL. (в конец ссылки, аналогично параметру GET): <А HREF="link.php?<?=SID?>">
Использование переменных сеанса. Зарегистрировать ID пользователяв переменной сеанса.
А затем проверять зарегистрирована ли переменная.