Ruby Web Applications - CGI Programming

Ruby - это язык общего назначения; его нельзя назвать веб-языком. Тем не менее, веб-приложения и веб-инструменты в целом являются одними из наиболее распространенных применений Ruby.

Вы можете не только написать свой собственный SMTP-сервер, FTP-демон или веб-сервер на Ruby, но вы также можете использовать Ruby для более обычных задач, таких как программирование CGI или как замена PHP.

CGI Programming CGI Programming_-1


Writing CGI Scripts

Самый простой сценарий CGI на Ruby выглядит так:

#!/usr/bin/ruby

puts "HTTP/1.0 200 OK"

puts "Content-type: text/html\n\n"

puts "<html><body>This is a test</body></html>"

Если вы вызовете этот сценарий test.cgi и загрузите его поставщику веб-хостинга на базе Unix с соответствующими разрешениями, вы можете использовать его как сценарий CGI.

Например, если у вас есть веб-сайт https://www.example.com/, размещенный у провайдера веб-хостинга Linux, и вы загружаете test.cgi в главный каталог и даете ему права на выполнение, а затем посещаете https: // www. example.com/test.cgi должен вернуть HTML-страницу с надписью «This is a test».

Здесь, когда test.cgi запрашивается из веб-браузера, веб-сервер ищет test.cgi на веб-сайте, а затем выполняет его с помощью интерпретатора Ruby. Сценарий Ruby возвращает базовый заголовок HTTP, а затем - базовый документ HTML.

Using 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-объект и использовали его для печати строки заголовка.

Form Processing

Using class CGI gives you access to HTML query parameters in two ways. Suppose we are given a URL of /cgi-bin/test.cgi?FirstName = Zara&LastName = Ali.

You can access the parameters FirstName and LastName using CGI#[] directly as follows −

#!/usr/bin/ruby


require 'cgi'

cgi = CGI.new

cgi['FirstName'] # => ["Zara"]

cgi['LastName'] # => ["Ali"]

There is another way to access these form variables. This code will give you a hash of all the key and values −

#!/usr/bin/ruby


require 'cgi'

cgi = CGI.new

h = cgi.params # => {"FirstName"=>["Zara"],"LastName"=>["Ali"]}

h['FirstName'] # => ["Zara"]

h['LastName'] # => ["Ali"]

Following is the code to retrieve all the keys −

#!/usr/bin/ruby


require 'cgi'

cgi = CGI.new

cgi.keys # => ["FirstName", "LastName"]

If a form contains multiple fields with the same name, the corresponding values will be returned to the script as an array. The [] accessor returns just the first of these.index the result of the params method to get them all.

In this example, assume the form has three fields called "name" and we entered three names "Zara", "Huma" and "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"]}

Note − Ruby will take care of GET and POST methods automatically. There is no separate treatment for these two different methods.

An associated, but basic, form that could send the correct data would have the HTML code like so −

<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>

Creating Forms and HTML

CGI содержит огромное количество методов, используемых для создания 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

}

}

}

}

NOTE − The form method of the CGI class can accept a method parameter, which will set the HTTP method ( GET, POST, and so on...) to be used on form submittal. The default, used in this example, is POST.

This will produce the following result −

Content-Type: text/html

Content-Length: 302


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Final//EN">


<HTML>

<HEAD>

<TITLE>This Is a Test</TITLE>

</HEAD>

<BODY>

<FORM METHOD = "post" ENCTYPE = "application/x-www-form-urlencoded">

<HR>

<H1>A Form: </H1>

<TEXTAREA COLS = "70" NAME = "get_text" ROWS = "10"></TEXTAREA>

<BR>

<INPUT TYPE = "submit">

</FORM>

</BODY>

</HTML>


Quoting Strings

When dealing with URLs and HTML code, you must be careful to quote certain characters. For instance, a slash character ( / ) has special meaning in a URL, so it must be escaped if it's not part of the pathname.

For example, any / in the query portion of the URL will be translated to the string %2F and must be translated back to a / for you to use it. Space and ampersand are also special characters. To handle this, CGI provides the routines CGI.escape and CGI.unescape.

#!/usr/bin/ruby


require 'cgi'

puts CGI.escape(Zara Ali/A Sweet & Sour Girl")

This will produce the following result −

Zara+Ali%2FA Sweet+%26+Sour+Girl")


#!/usr/bin/ruby


require 'cgi'

puts CGI.escapeHTML('<h1>Zara Ali/A Sweet & Sour Girl</h1>')

This will produce the following result −

&lt;h1&gt;Zara Ali/A Sweet & Sour Girl&lt;/h1&gt;'


Useful Methods in CGI Class

Here is the list of methods related to CGI class −

  • The Ruby CGI − Methods related to Standard CGI library.

Cookies and Sessions

We have explained these two concepts in different sections. Please follow the sections −

Web Hosting Servers

You could check the following topic on the internet to host your website on a Unix-based Server −


В заключении полезно попрактиваться ...непосредственно, веб-сервер Apache в Ubuntu 18.04

Изначально не стоит, в чем можно убедиться командой

$ sudo systemctl status apache2

Unit apache2.service could not be found.

или просто попробовать загрузить в браузере:

http://192.168...../

... и далее;

обновляем индекс пакетов и сами пакеты

$ sudo apt update && sudo apt upgrade -y (и без вопросов!)

Ставим Apache:

$ sudo apt install apache2

Настраиваем фаервол, какие есть профили:(..можно и не делать в тестовом варианте)


$ sudo ufw app list

Available applications:

Apache

Apache Full

Apache Secure

OpenSSH

...где:

Apache: профиль открывает порт 80 (обычный, не шифрованный веб-трафик).

Apache Full: профиль открывает порты 80 (обычный, не шифрованный веб-трафик) и 443 (трафик шифруется с помощью TLS/SSL).

Apache Secure: профиль открывает только порт 443 (трафик шифруется с помощью TLS/SSL).

OpenSSH: в зависимости от того, что понаписано в /etc/ssh/sshd_config

Активируем обычный профиль, то есть "Apache"

$ sudo ufw allow 'Apache'

Rules updated

Rules updated (v6)

Активируем:

$ sudo ufw enable

Firewall is active and enabled on system startup

$ sudo ufw status

Status: active


To Action From

-- ------ ----

Apache ALLOW Anywhere

Apache (v6) ALLOW Anywhere (v6)

Не забывая SSH:

$ sudo ufw allow 'OpenSSH'

$ sudo ufw status verbose

Status: active

Logging: on (low)

Default: deny (incoming), allow (outgoing), deny (routed)

New profiles: skip


To Action From

-- ------ ----

80/tcp (Apache) ALLOW IN Anywhere

22/tcp (OpenSSH) ALLOW IN Anywhere

80/tcp (Apache (v6)) ALLOW IN Anywhere (v6)

22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)

Переходим к CGI:

...ну и тут добавить вообщем то не чего, но я попытаюсь:

user@ubserv:~$ curl -v http://127.0.0.1

* Rebuilt URL to: http://127.0.0.1/

* Trying 127.0.0.1...

* TCP_NODELAY set

* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)

> GET / HTTP/1.1

> Host: 127.0.0.1

> User-Agent: curl/7.58.0

> Accept: */*

>

< HTTP/1.1 200 OK

< Date: Sun, 27 Sep 2020 14:51:47 GMT

< Server: Apache/2.4.29 (Ubuntu)

Сначала смотрим, что у нас с модулем CGI(cgi.load), который хранится по пути:

cd /etc/apache2/mods-available

убеждаемся в его наличии, переходим:

cd /etc/apache2/mods-enabled

и видим, что он не активирован, то есть его там нет, активируем добавлением символической ссылки в /etc/apache2/mods-available

$ sudo ln -s ../mods-available/cgi.load

Убеждаемся;

/etc/apache2/mods-enabled$ ls

access_compat.load authn_file.load autoindex.load dir.load mpm_event.conf reqtimeout.load alias.conf authz_core.load cgi.load env.load mpm_event.load setenvif.con alias.load authz_host.load deflate.conf filter.load negotiation.conf setenvif.load auth_basic.load authz_user.load deflate.load mime.conf negotiation.load status.confauthn_core.load autoindex.conf dir.conf mime.load reqtimeout.conf status.load

PS: Для кого то будет проще использовать утилиту a2enmod - это сценарий, который включает указанный модуль в конфигурации apache2, делает это, создавая символические ссылки в / etc / apache2 / mods-enabled. Аналогично, a2dismod отключает модуль, удаляя эти символические ссылки, что и было проделано выше, простым крестьянским методом.

Не лишне поинтересоваться содержанием:

$ cat /etc/apache2/conf-available/serve-cgi-bin.conf

<IfModule mod_alias.c>

<IfModule mod_cgi.c>

Define ENABLE_USR_LIB_CGI_BIN

</IfModule>

<IfModule mod_cgid.c>

Define ENABLE_USR_LIB_CGI_BIN

</IfModule>

<IfDefine ENABLE_USR_LIB_CGI_BIN>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

<Directory "/usr/lib/cgi-bin">

AllowOverride None

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch

Require all granted

</Directory>

</IfDefine>

</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

И если есть желание изменить дирректорию по умолчанию для CGI скпиптов, например так:

<IfModule mod_alias.c>

<IfModule mod_cgi.c>

Define ENABLE_USR_LIB_CGI_BIN

</IfModule>

<IfModule mod_cgid.c>

Define ENABLE_USR_LIB_CGI_BIN

</IfModule>

<IfDefine ENABLE_USR_LIB_CGI_BIN>

# ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

# <Directory "/usr/lib/cgi-bin">

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

<Directory "/var/www/cgi-bin">

AllowOverride None

Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch

Require all granted

</Directory>

</IfDefine>

</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

На последок перезагрузить apache:

======$ sudo service apache2 reload========

$ sudo service apache2 reload

$ sudo service apache2 status

● apache2.service - The Apache HTTP Server

Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)

Создадим тестовый скрипт, пока на bash:

user@ubserv:/usr/lib/cgi-bin$ cat firstpage.cgi

#!/bin/sh

#firstpage.cgi

#отображение тестовой страницы

MYDATE=`date +%A" "%d" "%B" "%Y`

USERS=`who |wc -l`

echo "Content-type: text/html"

echo ""

echo "<HTML>"

echo "<H1><CENTER>THIS IS CGI PAGE</CENTER></H1>"

echo "<HR>"

echo "<H3><CENTER>UBUNTU_SERVER 18.04:</CENTER></H3>"

echo "<H3>/etc/apache2 - directory, which is the standard place to find the configuration files of Apache.</H3>"

echo "<H3>/etc/apache2/conf-available/serve-cgi-bin.conf - file that has a symbolic link from /etc/apache2/conf-enabled/serve-cgi-bin.conf</H3>"

echo "<H3>To see in detail, just click <A HREF="https://code-maven.com/set-up-cgi-with-apache"> HERE</A>

&<A HREF="https://www.digitalocean.com/community/tutorials/apache-ubuntu-18-04-ru"> HERE</A>

<H3>"

echo "<H2><CENTER>$MYDATE</CENTER></H2>"

echo "<H3><CENTER> Total amount of users on to-day: $USERS</CENTER></H3>"


echo "<H2><CENTER> ENVIRONMENT: </CENTER></H2>"

echo "</HTML>"

#####################

echo "<HTML><PRE>"

env

echo "</PRE></HTML>"

####################

user@ubserv:/usr/lib/cgi-bin$

....поместив его по пути: /usr/lib/cgi-bin и назначив ему права: chmod +x и в итоге:

....большая часть взята от сюда: CGI Programming_-1

$ curl -v http://127.0.0.1/cgi-bin/firstpage.cgi

* Trying 127.0.0.1...

* TCP_NODELAY set

* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)

> GET /cgi-bin/firstpage.cgi HTTP/1.1

> Host: 127.0.0.1

> User-Agent: curl/7.58.0

> Accept: */*

>

< HTTP/1.1 200 OK

< Date: Mon, 28 Sep 2020 13:07:43 GMT

< Server: Apache/2.4.29 (Ubuntu)

< Vary: Accept-Encoding

< Transfer-Encoding: chunked

< Content-Type: text/html

<

<HTML>

<H1><CENTER>THIS IS CGI PAGE</CENTER></H1>

<HR>

<H3><CENTER>UBUNTU_SERVER 18.04:</CENTER></H3>

<H3>/etc/apache2 - directory, which is the standard place to find the configuration files of Apache.</H3>

<H3>/etc/apache2/conf-available/serve-cgi-bin.conf - file that has a symbolic link from /etc/apache2/conf-enabled/serve-cgi-bin.conf</H3>

<H3>To see in detail, just click <A HREF=https://code-maven.com/set-up-cgi-with-apache> HERE</A>

&<A HREF=https://www.digitalocean.com/community/tutorials/apache-ubuntu-18-04-ru> HERE</A>

<H3>

<H2><CENTER>Monday 28 September 2020</CENTER></H2>

<H3><CENTER> Total amount of users on to-day: 1</CENTER></H3>

<H2><CENTER> ENVIRONMENT: </CENTER></H2>

</HTML>

<HTML><PRE>

GATEWAY_INTERFACE=CGI/1.1

REMOTE_ADDR=127.0.0.1

QUERY_STRING=

HTTP_USER_AGENT=curl/7.58.0

DOCUMENT_ROOT=/var/www/html

REMOTE_PORT=56682

HTTP_ACCEPT=*/*

SERVER_SIGNATURE=<address>Apache/2.4.29 (Ubuntu) Server at 127.0.0.1 Port 80</address>


CONTEXT_DOCUMENT_ROOT=/usr/lib/cgi-bin/

SCRIPT_FILENAME=/usr/lib/cgi-bin/firstpage.cgi

HTTP_HOST=127.0.0.1

REQUEST_URI=/cgi-bin/firstpage.cgi

SERVER_SOFTWARE=Apache/2.4.29 (Ubuntu)

REQUEST_SCHEME=http

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

SERVER_PROTOCOL=HTTP/1.1

REQUEST_METHOD=GET

SERVER_ADDR=127.0.0.1

SERVER_ADMIN=webmaster@localhost

CONTEXT_PREFIX=/cgi-bin/

PWD=/usr/lib/cgi-bin

SERVER_PORT=80

SCRIPT_NAME=/cgi-bin/firstpage.cgi

SERVER_NAME=127.0.0.1

</PRE></HTML>

* Connection #0 to host 127.0.0.1 left intact

user@ubserv:~$