Latest web development tutorials

Programmation Perl CGI

Qu'est-ce que CGI

CGI actuellement maintenu par NCSA, NCSA CGI est défini comme suit:

CGI (Common Gateway Interface), Common Gateway Interface, qui est un programme en cours d'exécution sur le serveur, telles que: serveur HTTP, l'interface client fournissant la même page HTML.


navigation sur le Web

Pour mieux comprendre comment CGI fonctionne, on peut cliquer sur un lien sur une page Web ou URL du processus:

  • 1, utilisez votre navigateur pour accéder à l'URL et la connexion au serveur Web HTTP.
  • 2, serveur Web reçoit le message de demande sera analysée URL et regarder les fichiers disponibles sur le serveur s'il y a, si l'on veut retourner le contenu du fichier, sinon il renvoie un message d'erreur.
  • 3, le navigateur reçoit les informations du serveur et affiche les messages de fichiers ou d'erreur reçus.

Les programmes CGI peuvent être un script Python, PERL de script, le script SHELL, C ou programmes C ++.


CGI Graphique

cgiarch


configuration du serveur Web et de soutien

Avant de procéder à la programmation CGI, assurez-vous que votre serveur Web a été configuré pour soutenir CGI et gestionnaire de CGI.

Apache prend en charge la configuration de CGI:

Mettre en place le répertoire CGI:

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

Tout serveur HTTP pour exécuter des programmes CGI sont stockés dans un répertoire pré-configuré. Ce répertoire est appelé le répertoire CGI, et par convention, il est nommé var / www / / cgi-bin.

fichier CGI .cgi, Perl peut aussi utiliser l'extension .pl.

Par défaut, la configuration du serveur Linux exécutant répertoire cgi-bin / var / www.

Si vous souhaitez spécifier un répertoire différent pour exécuter des scripts CGI, vous pouvez modifier le fichier de configuration httpd.conf comme suit:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI
   Order allow,deny
   Allow from all
</Directory>

Ajouter le suffixe .pl AddHandler, afin que nous puissions accéder à la fin du fichier .pl script Perl:

AddHandler cgi-script .cgi .pl .py

Le premier programme de CGI

Ci-dessous, nous créons un fichier test.cgi, le code est le suivant:

#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! </h2>';
print '<p>来自本教程第一个 CGI 程序。</p>';
print '</body>';
print '</html>';

1;

Ensuite, ouvrez votre navigateur à l'adresse http: //localhost/cgi-bin/test.cgi, les résultats de sortie sont les suivantes:

La sortie de la première ligne du script "Content-type: text / html \ r \ n \ r \ n" est envoyé au navigateur et indiquer au navigateur pour afficher le type de contenu "text / html".


en-tête HTTP

le contenu du fichier test.cgi dans: une partie de l'en-tête HTTP est "Content-type text / html", il sera envoyé au type de contenu du navigateur indique les fichiers du navigateur.

le format d'en-tête HTTP est la suivante:

HTTP 字段名: 字段内容

Par exemple:

Content-type:text/html\r\n\r\n

Le tableau suivant décrit les informations contenues dans les programmes CGI d'en-tête HTTP sont souvent utilisés:

tête description
Content-Type: MIME entité correspondant à la demande d'information. Par exemple: Content-type: text / html
Expire: Date date et l'heure de réponse expiré
Lieu: URL Pour rediriger le destinataire à une demande non-localisation URL pour compléter la demande ou de l'identification de nouvelles ressources
Dernière modification: Date La ressource demandée a été modifié
Content-length: N demande Content-Length
Set-Cookie: String Paramètres des cookies Http

Variables d'environnement CGI

Tous les programmes CGI ont reçu les variables d'environnement suivantes, qui ont joué un rôle important dans le programme CGI:

nom de la variable description
CONTENT_TYPE Cette valeur indique que la variable d'environnement du type de transfert d'informations MIME. À l'heure actuelle, les variables d'environnement sont généralement CONTENT_TYPE: application / x-www-form-urlencoded, il a dit que les données du formulaire HTML.
CONTENT_LENGTH Si les informations du serveur de mode de transfert et le programme CGI est POST, même si l'environnement entrée STDIN variable, le nombre d'octets qui peuvent être lues des données valides de la norme. Cette variable d'environnement lors de la lecture des données d'entrée doit être utilisé.
HTTP_COOKIE teneur en COOKIE dans le client.
HTTP_USER_AGENT Fournir de l'information comprend le numéro de version du navigateur du client ou d'autres données propriétaires.
PATH_INFO La valeur de cette variable d'environnement indique le nom du programme CGI immédiatement après les informations de chemin supplémentaire. Il apparaît souvent comme un argument de programme CGI.
QUERY_STRING Si les informations du serveur de mode de transfert et le programme CGI est l'information GET, la valeur de cette variable d'environnement, même si elle est adoptée. Cette information est suivie par le nom du programme CGI, tant dans le milieu avec un point d'interrogation "?" Separator.
REMOTE_ADDR La valeur de cette variable d'environnement est l'adresse IP du client envoie une requête, par exemple, le 192.168.1.67 ci-dessus. Cette valeur est toujours présente. Et il est la nécessité de fournir le client Web à l'identificateur unique du serveur Web peut être utilisé dans les programmes CGI pour distinguer entre les différents client Web.
REMOTE_HOST La valeur de cette variable d'environnement contient le nom d'hôte du client demandeur de CGI. Si cela ne vous veut pas de vérifier, vous ne devez définir cette variable d'environnement.
REQUEST_METHOD Il fournit une méthode appelée script. Pour HTTP script / protocole 1.0 que GET et POST significative.
SCRIPT_FILENAME Le chemin d'accès complet aux scripts CGI
SCRIPT_NAME Le nom du script CGI
SERVER_NAME Ceci est le nom d'hôte, alias, ou l'adresse IP de votre serveur WEB.
SERVER_SOFTWARE La valeur de cette variable d'environnement contient l'appel CGI nom et la version numéro de programme du serveur HTTP. Par exemple, la valeur au-dessus d'Apache / 2.2.14 (Unix)

Voici un simple variables d'environnement sortie CGI script CGI:

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print '<meta charset="utf-8">';
print "<font size=+1>环境变量:</font>\n";
foreach (sort keys %ENV)
{
  print "<b>$_</b>: $ENV{$_}<br>\n";
}

1;

Téléchargements

Si nous voulons atteindre grâce à Perl téléchargements de fichiers CGI, nécessitent un ensemble différent d'informations d'en-tête comme suit:

#!/usr/bin/perl

# HTTP Header
print "Content-Type:application/octet-stream; name=\"FileName\"\r\n";
print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n";

# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) )
{
   print("$buffer");
}

Utilisez la méthode GET de transfert de données

GET méthode pour envoyer les informations utilisateur codé sur le serveur, les informations de données est contenue dans l'URL de la demande de page à nombre divisé comme suit: "?":

http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
GET demandes au sujet de certains des autres commentaires:
  • GET demande peut être mis en cache
  • demande GET reste dans l'historique du navigateur
  • Les requêtes GET peuvent être mis en signet
  • GET demandes ne devraient pas être utilisés lors du traitement de données sensibles
  • GET demandes ont des restrictions de longueur
  • GET demandes ne devraient être utilisées pour récupérer des données

Des exemples de simples url: méthode GET

Ce qui suit est une URL simple, en utilisant la méthode GET pour envoyer deux paramètres à programme test.cgi:

/cgi-bin/test.cgi?name=本教程&url=http://www.w3big.com

Un fichier code test.cgi:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取文本信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET")
{
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$name = $FORM{name};
$url  = $FORM{url};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>$name网址:$url</h2>";
print "</body>";
print "</html>";

1;

Vérifiez votre navigateur, les résultats de sortie sont les suivantes:

Des exemples de forme simple: méthode GET

Voici deux envoyer des données au serveur en utilisant la méthode GET via un formulaire HTML, soumis le même document test.cgi de script serveur, test.html code est le suivant:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="get">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

la mise en oeuvre du navigateur Les résultats sont les suivants:


Utilisez la méthode POST pour transmettre des données

Utilisation de la méthode POST pour transmettre des données au serveur est plus sécurisé et fiable, que des informations sensibles telles que les mots de passe des utilisateurs ont besoin d'utiliser POST pour transférer des données.

Ce qui suit est test.cgi aussi, il peut également gérer POST des données de formulaire soumises par le navigateur:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取文本信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$name = $FORM{name};
$url  = $FORM{url};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>$name网址:$url</h2>";
print "</body>";
print "</html>";

1;

Voici deux envoyer des données au serveur en utilisant la méthode GET via un formulaire HTML, soumis le même document test.cgi de script serveur, test.html code est le suivant:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

la mise en oeuvre du navigateur Les résultats sont les suivants:

programme CGI pour transmettre des données par le biais de la case à cocher

case utilisée pour soumettre une ou plusieurs données d'options, test.html code est le suivant:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="POST" target="_blank">
<input type="checkbox" name="w3big" value="on" /> 本教程
<input type="checkbox" name="google" value="on" /> Google
<input type="submit" value="选择站点" />
</form>
</body>
</html>

Un fichier code test.cgi:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
if( $FORM{w3big} ){
   $w3big_flag ="ON";
}else{
   $w3big_flag ="OFF";
}
if( $FORM{google} ){
   $google_flag ="ON";
}else{
   $google_flag ="OFF";
}

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2> 本教程选中状态 : $w3big_flag</h2>";
print "<h2> Google 选择状态 : $google_flag</h2>";
print "</body>";
print "</html>";

1;

la mise en oeuvre du navigateur Les résultats sont les suivants:


transfert de données radio via le programme CGI

Radio uniquement transférer des données à un serveur, test.html code est le suivant:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<input type="radio" name="site" value="w3big" /> 本教程
<input type="radio" name="site" value="google" /> Google
<input type="submit" value="提交" />
</form>
</body>
</html>

code de script test.cgi est la suivante:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$site = $FORM{site};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2> 选择的网站 $site</h2>";
print "</body>";
print "</html>";

1;

la mise en oeuvre du navigateur Les résultats sont les suivants:


de transfert de données via Textarea programme CGI

passe Textarea multiples lignes de données vers le serveur, test.html code est le suivant:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<textarea name="textcontent" cols="40" rows="4">
在这里输入内容...
</textarea>
<input type="submit" value="提交" />
</form>
</body>
</html>

code de script test.cgi est la suivante:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>输入的文本内容为:$text_content</h2>";
print "</body>";
print "</html>";

1;

la mise en oeuvre du navigateur Les résultats sont les suivants:


programme CGI pour transmettre des données à travers le pull-down

HTML code de la boîte de liste déroulante comme suit:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<select name="dropdown">
<option value="w3big" selected>本教程</option>
<option value="google">Google</option>
</select>
<input type="submit" value="提交"/>
</form>
</body>
</html>

code de script test.cgi comme suit:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$site = $FORM{dropdown};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>选择的网站是:$site</h2>";
print "</body>";
print "</html>";

1;

la mise en oeuvre du navigateur Les résultats sont les suivants:


CGI est utilisé Cookie

protocole Http dans un gros inconvénient est erroné de juger de l'identité d'un utilisateur, ce qui donne aux programmeurs beaucoup d'inconvénients, mais il semble fonctionnalité de cookie compensé cette lacune.

cookie qui accède au script lorsque le client via le navigateur du client sur le disque dur du client d'écrire des enregistrements de données, récupérer des données lorsqu'un client visite le script suivant, de manière à atteindre la fonction de déterminer l'identité, biscuit couramment utilisé dans la vérification de l'identité.

syntaxe cookie

Http cookie est envoyé par l'en-tête HTTP pour atteindre, il a dû transférer des fichiers, syntaxe tête Set-Cookie est le suivant:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = nom: pour définir la valeur du cookie (nom ne peut pas être utilisé "," et "," nombre), quand il y a plusieurs valeurs de nom "," pour séparer, par exemple: nom1 = nom1; nom2 = nom2 ; nom3 = nom3.
  • expires = Date: biscuit date d'expiration dans le format: expires = "Wdy, DD- Lu-AAAA HH: MM: SS"
  • path = chemin: le chemin d' accès défini le support des cookies, si le chemin est un chemin, le cookie pour tous les fichiers et sous - répertoires de l'entrée de répertoire en vigueur, par exemple: path = "/ cgi-bin /", si le chemin est un fichier, biscuit Elle se réfère à l'entrée en vigueur de ce fichier, par exemple: path = "/ cgi-bin / cookie.cgi".
  • domain = domain: le nom de domaine du cookie est valide, par exemple: domain = "www.w3big.com"
  • sécuriser: Si ce drapeau est donné, que le cookie ne peut être transmis via le protocole SSL serveur https.
  • cookie est reçu par la définition des variables d'environnement HTTP_COOKIE atteint, les programmes CGI peuvent obtenir des informations en récupérant la variable de cookie.

Paramètres des cookies

Paramètres des cookies est très simple, biscuits seront envoyés séparément à l'en-tête http. L'exemple suivant définit le UserID, mot de passe et expire dans un cookie:

#!/usr/bin/perl

print "Set-Cookie:UserID=XYZ;\n";
print "Set-Cookie:Password=XYZ123;\n";
print "Set-Cookie:Expires=Tuesday, 31-Dec-2017 23:12:40 GMT";\n";
print "Set-Cookie:Domain=www.w3big.com;\n";
print "Set-Cookie:Path=/perl;\n";
print "Content-type:text/html\r\n\r\n";
...........其他 HTML 内容

Trouver Cookie

Cookie page recherche d'information est très simple, dans le CGI des variables d'environnement HTTP_COOKIE, le format de stockage est la suivante informations Cookie est stocké:

#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'};
@cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ){
   ($key, $val) = split(/=/, $cookie); # splits on the first =.
   $key =~ s/^\s+//;
   $val =~ s/^\s+//;
   $key =~ s/\s+$//;
   $val =~ s/\s+$//;
   if( $key eq "UserID" ){
      $user_id = $val;
   }elsif($key eq "Password"){
      $password = $val;
   }
}
print "User ID  = $user_id\n";
print "Password = $password\n";

L'exemple ci-dessus sortie est:

User ID = XYZ
Password = XYZ123

module CGI

Perl CGI fournit de nombreux modules intégrés, utilisé les deux suivantes: