Программирование CGI на Ruby
Ruby — это язык общего назначения, не только язык для WEB-разработки, но Ruby наиболее часто используется при разработке WEB-приложений и WEB-инструментов.
Используя Ruby, можно не только написать собственный SMTP-сервер, FTP-программу или Ruby Web-сервер, но и использовать Ruby для CGI-программирования.
Далее давайте немного времени уделим изучению программирования CGI на Ruby.
Просмотр веб-страниц
Чтобы лучше понять, как работает CGI, мы можем рассмотреть последовательность действий при нажатии ссылки или URL на веб-странице:
- 1. Используйте браузер, чтобы открыть URL и подключиться к веб-серверу HTTP.
- 2. После получения запроса веб-сервер анализирует URL и проверяет, существует ли запрашиваемый файл на сервере. Если он существует, он возвращает содержимое файла; в противном случае он возвращает сообщение об ошибке.
- 3. Браузер получает информацию от сервера и отображает полученный файл или сообщение об ошибке.
CGI-программы могут представлять собой скрипты Ruby, скрипты Python, скрипты PERL, скрипты SHELL, программы на C или C++ и т. д.
Схема архитектуры CGI

Поддержка и настройка веб-сервера
Прежде чем начать программирование CGI, убедитесь, что ваш веб-сервер поддерживает CGI и что обработчик CGI настроен.
Конфигурация CGI в Apache:
Настройте каталог CGI:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
CGI-программы, выполняемые всеми HTTP-серверами, хранятся в предварительно настроенном каталоге. Этот каталог называется каталогом CGI и по соглашению имеет имя /var/www/cgi-bin.
Расширение файлов CGI — .cgi, и Ruby также может использовать расширение .rb.
По умолчанию на серверах Linux настроенный каталог cgi-bin — /var/www.
Если вы хотите указать другой каталог для запуска CGI-скриптов, вы можете изменить файл конфигурации httpd.conf следующим образом:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
Добавьте суффикс .rb в AddHandler, чтобы мы могли получать доступ к файлам сценариев Ruby, заканчивающимся на .rb:
AddHandler cgi-script .cgi .pl .rb
Написание CGI-скриптов
Самый базовый код CGI на Ruby выглядит следующим образом:
#!/usr/bin/ruby puts "Content-type: text/html\n\n" puts "<html><body>This is a test</body></html>"
Вы можете сохранить этот код в файл test.cgi, загрузить его на сервер и предоставить достаточные права, после чего он может выполняться как CGI-скрипт.
Если адрес вашего сайта — http://www.example.com/, вы можете обратиться к программе по адресу http://www.example.com/test.cgi, и результат вывода будет: "This is a test."
После того как браузер обратится по URL, веб-сервер найдёт файл test.cgi в каталоге сайта, затем с помощью парсера Ruby разберёт код скрипта и получит доступ к HTML-документу.
Использование cgi.rb
Ruby может подключать библиотеку CGI для написания более сложных CGI-скриптов.
Следующий код подключает библиотеку CGI для создания CGI-скрипта.
#!/usr/bin/ruby require 'cgi' cgi = CGI.new puts cgi.header puts "<html><body>This is a test</body></html>"
В следующем коде создаётся объект CGI и выводится информация заголовка.
Обработка форм
Используя библиотеку CGI, можно получать данные, отправленные формами (или параметры в URL), двумя способами, например URL: /cgi-bin/test.cgi?FirstName=Zara&LastName=Ali.
Вы можете использовать CGI#[] для непосредственного получения параметров FirstName и LastName:
#!/usr/bin/ruby require 'cgi' cgi = CGI.new cgi['FirstName'] # => ["Zara"] cgi['LastName'] # => ["Ali"]
Другой способ получения данных формы:
#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
h = cgi.params # => {"FirstName"=>["Zara"],"LastName"=>["Ali"]}
h['FirstName'] # => ["Zara"]
h['LastName'] # => ["Ali"]
Следующий код используется для получения всех пар ключ-значение:
#!/usr/bin/ruby require 'cgi' cgi = CGI.new cgi.keys # => ["FirstName", "LastName"]
Если форма содержит несколько полей с одинаковым именем, значения одного и того же поля будут сохранены в массиве.
В следующем примере в форме указаны три одинаковых поля "name" со значениями "Zara", "Huma" и "Nuha":
#!/usr/bin/ruby
require 'cgi'
cgi = CGI.new
cgi['name'] # => "Zara"
cgi.params['name'] # => ["Zara", "Huma", "Nuha"]
cgi.keys # => ["name"]
cgi.params # => {"name"=>["Zara", "Huma", "Nuha"]}
Примечание:Ruby автоматически определяет методы GET и POST, поэтому нет необходимости по-разному обрабатывать эти два метода.
Ниже приведён соответствующий HTML-код:
<html> <body> <form method="POST" action="http://www.example.com/test.cgi"> First Name :<input type="text" name="FirstName" value="" /> <br /> Last Name :<input type="text" name="LastName" value="" /> <input type="submit" value="Submit Data" /> </form> </body> </html>
Создание формы и HTML
CGI содержит большое количество методов для создания HTML, и каждый HTML-тег имеет соответствующий метод. Перед использованием этих методов необходимо создать объект CGI с помощью CGI.new.
Чтобы упростить вложение тегов, эти методы принимают содержимое в виде блока кода, а блок кода возвращает строку как содержимое тега. Как показано ниже:
#!/usr/bin/ruby
require "cgi"
cgi = CGI.new("html4")
cgi.out{
cgi.html{
cgi.head{ "\n"+cgi.title{"This Is a Test"} } +
cgi.body{ "\n"+
cgi.form{"\n"+
cgi.hr +
cgi.h1 { "A Form: " } + "\n"+
cgi.textarea("get_text") +"\n"+
cgi.br +
cgi.submit
}
}
}
}
Экранирование строк
Когда вы работаете с параметрами в URL-адресах или данными HTML-форм, вам нужно экранировать некоторые специальные символы, такие как кавычки (") и обратная косая черта (/).
Объект Ruby CGI предоставляет методы CGI.escape и CGI.unescape для обработки экранирования этих специальных символов:
#!/usr/bin/ruby require 'cgi' puts CGI.escape(Zara Ali/A Sweet & Sour Girl")
Результат выполнения приведённого выше кода следующий:
#!/usr/bin/ruby require 'cgi' puts CGI.escape(Zara Ali/A Sweet & Sour Girl")
Ещё один набор примеров:
#!/usr/bin/ruby
require 'cgi'
puts CGI.escapeHTML('<h1>Zara Ali/A Sweet & Sour Girl</h1>')
Результат выполнения приведённого выше кода следующий:
<h1>Zara Ali/A Sweet & Sour Girl</h1>'
Часто используемые методы в классе CGI
Ниже приведены соответствующие методы полного класса CGI в Ruby
- Ruby CGI- Стандартные методы библиотеки CGI
Куки и сессии
- Куки Ruby CGI- Как обрабатывать CGI-куки.
- Сессии Ruby CGI- Как обрабатывать CGI-сессии.