Latest web development tutorials

Perl-CGI-Programmierung

Was ist CGI

CGI derzeit verwaltet von NCSA, NCSA CGI ist wie folgt definiert:

CGI (Common Gateway Interface), Common Gateway Interface, das ein Programm auf dem Server ausgeführt wird, wie zum Beispiel: HTTP-Server, die Client-Schnittstelle die gleiche HTML-Seite bereitstellt.


Web-Browsing

Um besser zu verstehen, wie CGI funktioniert, können wir auf einen Link klicken Sie auf einer Webseite oder URL des Prozesses:

  • 1, verwenden Sie Ihren Browser auf die URL zugreifen und an den HTTP-Web-Server verbinden.
  • 2, Web-Server empfängt die Anforderungsnachricht URL analysiert werden und der Zugriff auf Dateien auf dem Server aussehen, wenn es, wenn es um den Inhalt der Datei zurück, sonst wird es eine Fehlermeldung zurück.
  • 3 empfängt der Browser die Informationen von dem Server und zeigt die empfangene Datei oder Fehlermeldungen.

CGI-Programme können ein Python-Skript, PERL-Skript, Shell-Skript, C oder C ++ Programme sein.


CGI-Diagramm

cgiarch


Web-Server-Konfiguration und Support

Bevor Sie die CGI-Programmierung durchführen, stellen Sie sicher, dass Ihr Webserver konfiguriert wurde CGI und CGI-Handler zu unterstützen.

Apache unterstützt CGI-Konfiguration:

Stellen Sie das CGI-Verzeichnis auf:

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

Alle HTTP-Server CGI-Programme auszuführen, werden in einem vorkonfigurierten Verzeichnis gespeichert. Dieses Verzeichnis ist das CGI-Verzeichnis genannt, und durch Konvention, es heißt / var / www / cgi-bin-Verzeichnis.

CGI Dateierweiterung .cgi kann Perl auch die .pl-Erweiterung verwenden.

Standardmäßig Linux-Server-Konfiguration cgi-bin-Verzeichnis ausgeführt wird, ist / var / www.

Wenn Sie ein anderes Verzeichnis angeben möchten, CGI-Skripte ausführen, können Sie die Konfigurationsdatei httpd.conf wie folgt ändern:

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

In Suffix .pl AddHandler, so können wir das Ende des .pl Perl-Script-Datei zugreifen:

AddHandler cgi-script .cgi .pl .py

Das erste CGI-Programm

Im Folgenden eine test.cgi Datei zu erstellen, wird der Code wie folgt:

#!/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;

Dann öffnen Sie Ihren Browser auf http:, //localhost/cgi-bin/test.cgi Ausgabeergebnisse sind wie folgt:

Der Ausgang der ersten Zeile des Skripts "Content-type: text / html \ r \ n \ r \ n" an den Browser und geben dem Browser den Content-Type "text / html" angezeigt werden gesendet.


HTTP-Header

test.cgi Dateiinhalt in: Teil des HTTP-Header "Content-Type text / html", wird sie an den Browser-Inhaltstyp zeigt die Dateien Browser gesendet werden.

HTTP-Header-Format ist wie folgt:

HTTP 字段名: 字段内容

Zum Beispiel:

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

Die folgende Tabelle beschreibt die Informationen in den HTTP-Header CGI-Programme werden häufig verwendet:

Kopf Beschreibung
Content-type: MIME-Einheit an die Informationsanforderung entspricht. Zum Beispiel: Content-type: text / html
Gültig bis: Datum Antwort Datum und Zeit abgelaufen
Standort: URL Um den Empfänger in einen nicht-location URL Anfrage umleiten die Anfrage oder die Identifizierung neuer Ressourcen zu vervollständigen
Last-Modified: Datum Die angeforderte Ressource wurde zuletzt geändert
Content-length: N Content-Length-Anfrage
Set-Cookie: String Http Cookie-Einstellungen

CGI-Umgebungsvariablen

Alle CGI-Programme haben die folgenden Umgebungsvariablen erhalten, die eine wichtige Rolle in der CGI-Programm gespielt:

Variablenname Beschreibung
CONTENT_TYPE Dieser Wert zeigt an, dass die Umgebungsvariable auf den MIME-Typ der Informationsübertragung. Derzeit sind die Umgebungsvariablen im Allgemeinen CONTENT_TYPE: application / x-www-form-urlencoded, sagte er, dass die Daten aus dem HTML-Formular.
CONTENT_LENGTH Wenn der Übertragungsmodus-Server und CGI-Programminformationen POST, selbst wenn die Umgebungsvariable STDIN Eingabe der Anzahl von Bytes, die gültige Daten aus dem Standard gelesen werden kann. Diese Umgebungsvariable, wenn die Eingabedaten Lesen verwendet werden.
HTTP_COOKIE COOKIE Inhalt innerhalb des Client.
HTTP_USER_AGENT Die Bereitstellung von Informationen enthält die Versionsnummer der Client-Browser oder andere urheberrechtlich geschützte Daten.
PATH_INFO Der Wert dieser Umgebungsvariable gibt den Namen des CGI-Programms unmittelbar nach dem zusätzlichen Pfadinformationen. Oft scheint es, als Argument CGI-Programm.
QUERY_STRING Wenn der Übertragungsmodus-Server und CGI-Programminformationen Informationen zu erhalten, um den Wert dieser Umgebungsvariablen selbst wenn weitergegeben. Diese Information wird durch den Namen des CGI-Programms, die beide in der Mitte mit einem Fragezeichen "?" Separator gefolgt.
REMOTE_ADDR Der Wert dieser Umgebungsvariablen ist die IP-Adresse des Client eine Anfrage sendet, beispielsweise die oben 192.168.1.67. Dieser Wert ist immer vorhanden. Und es ist die Notwendigkeit der Web-Client auf dem Webserver die eindeutige Kennung zu schaffen, in CGI-Programmen verwendet werden, um zwischen verschiedenen Web-Client zu unterscheiden.
REMOTE_HOST Der Wert dieser Umgebungsvariable enthält den Host-Namen des anfordernden Clients von CGI. Wenn es Sie nicht überprüfen möchten, brauchen Sie nicht diese Umgebungsvariable zu definieren.
REQUEST_METHOD Es stellt eine Methode namens Skript. Für HTTP / 1.0-Protokoll-Skript nur GET und POST sinnvoll.
SCRIPT_FILENAME Der vollständige Pfad zum CGI-Skripten
SCRIPT_NAME Der Name des CGI-Skript
SERVER_NAME Dies ist der Hostname, Alias ​​oder IP-Adresse Ihres Web-Server.
SERVER_SOFTWARE Der Wert dieser Umgebungsvariable enthält den Aufruf CGI Programmnamen und die Versionsnummer des HTTP-Servers. Zum Beispiel kann der obige Wert von Apache / 2.2.14 (Unix)

Hier ist ein einfaches CGI-Skript-Ausgabe CGI-Umgebungsvariablen:

#!/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;

Downloads

Wenn wir durch Perl-CGI-Datei-Downloads erreichen wollen, benötigen einen anderen Satz von Header-Informationen wie folgt:

#!/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");
}

Verwenden Sie die GET-Methode zur Übertragung von Daten

GET Methode, um die codierten Benutzerinformationen an den Server zu senden, unterteilt die Dateninformationen in der URL der Seite Anfrage Nummer enthalten ist, wie folgt "?":

http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
GET-Anfragen über einige der anderen Kommentare:
  • GET Anfrage können zwischengespeichert werden
  • GET-Anforderung bleibt in der Browser-History
  • GET-Anfragen können Lesezeichen gespeichert werden
  • GET-Anforderungen sollten nicht verwendet werden, wenn sie mit sensiblen Daten zu tun
  • GET-Anforderungen haben Längenbeschränkungen
  • GET-Anfragen sollten nur verwendet werden, um Daten abzurufen

Beispiele für einfache url: Methode GET

Hier finden Sie eine einfache URL, GET-Methode unter Verwendung von zwei Parametern test.cgi Programm zu senden:

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

Ein Code test.cgi Datei:

#!/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;

Überprüfen Sie Ihre Browser sind die Ausgabeergebnisse wie folgt:

Beispiele für einfache Form: Methode GET

Es folgt eine zwei Daten senden an den Server der GET-Methode über ein HTML-Formular verwenden, eingereicht denselben Server-Skript test.cgi Dokument ist test.html Code wie folgt:

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

Browser Umsetzung der Ergebnisse ist wie folgt:


Verwenden Sie die POST-Methode Daten zu übergeben

Mit Hilfe der POST-Methode übergeben Daten an den Server sicherer und zuverlässiger, da einige sensible Daten wie Benutzerkennwörter POST verwenden müssen, ist es, Daten zu übertragen.

Auch die folgende test.cgi, kann es auch durch den Browser übermittelt POST Formulardaten verarbeiten:

#!/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;

Es folgt eine zwei Daten senden an den Server der GET-Methode über ein HTML-Formular verwenden, eingereicht denselben Server-Skript test.cgi Dokument ist test.html Code wie folgt:

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

Browser Umsetzung der Ergebnisse ist wie folgt:

CGI-Programm für die Datenübertragung durch das Kontrollkästchen

Checkbox, die eine oder mehrere Optionsdaten vorzulegen, ist test.html Code wie folgt:

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

Ein Code test.cgi Datei:

#!/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;

Browser Umsetzung der Ergebnisse ist wie folgt:


Funkdatenübertragung via CGI-Programm

Nur Radio übertragen Daten an einen Server, test.html Code ist wie folgt:

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

test.cgi Script-Code ist wie folgt:

#!/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;

Browser Umsetzung der Ergebnisse ist wie folgt:


Textarea Übertragung von Daten via CGI-Programm

TextArea- Pass mehrere Reihen von Daten an den Server ist test.html Code wie folgt:

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

test.cgi Script-Code ist wie folgt:

#!/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;

Browser Umsetzung der Ergebnisse ist wie folgt:


CGI-Programm für die Datenübertragung durch den Pull-down

HTML Dropdown-Feld Code wie folgt:

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

test.cgi Script-Code wie folgt:

#!/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;

Browser Umsetzung der Ergebnisse ist wie folgt:


CGI wird genutzt, Plätzchen

Http-Protokoll in einem großen Nachteil ist falsch die Identität eines Benutzers zu beurteilen, die Programmierer viel Unannehmlichkeiten geben, scheint aber die Cookie-Funktion für diesen Mangel besteht.

Cookie, das das Skript, während der Kunde durch den Browser des Kunden auf dem Client-Festplatte zugreift, um Datensätze zu schreiben, Daten abrufen, wenn ein Kunde das nächste Skript besucht, um die Funktion der Bestimmung der Identität zu erreichen, Cookie bei der Überprüfung der Identität verwendet.

Cookie-Syntax

Http-Cookie wird durch den HTTP-Header gesendet zu erreichen, hatte er die Übertragung von Dateien, Header-Set-Cookie-Syntax lautet wie folgt:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = Name: den Wert des Cookie zu setzen (Name nicht verwendet werden kann "," und "," Nummer), wenn es mehrere Namen Werte sind ";" zu trennen, zum Beispiel: name1 = name1, name2 = name2 ; name3 = name3.
  • Ablauf = Datum: Cookie Ablaufdatum im Format: abläuft = "WDY, DD- Mo-YYYY HH: MM: SS"
  • path = Pfad: der Pfad gesetzt Cookie - Unterstützung, wenn der Weg ist ein Weg, das Cookie für alle Dateien und Unterverzeichnisse des Verzeichnisses Inkrafttreten, zum Beispiel: path = "/ cgi-bin /", wenn der Pfad ist eine Datei, Cookie er bezieht sich auf das Inkrafttreten dieser Datei, zum Beispiel: path = "/ cgi-bin / cookie.cgi".
  • domain = Domain: der Domain - Name des Cookies gültig ist , zum Beispiel: domain = "www.w3big.com"
  • sichern: Wenn dieses Flag gegeben wird , dass das Cookie kann nur durch das SSL - Protokoll HTTPS - Server übertragen werden.
  • Cookie wird durch das Setzen von Umgebungsvariablen HTTP_COOKIE erreicht, CGI-Programme empfangenen Informationen durch Abfrage der Cookie-Variable erhalten.

Cookie-Einstellungen

Cookie-Einstellungen ist sehr einfach, Cookie wird separat unter http-Header gesendet. Im folgenden Beispiel wird die Benutzer-ID, Passwort und endet in einem 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 内容

Finden Plätzchen

Cookie-Information-Retrieval-Seite ist sehr einfach, in der CGI-Umgebungsvariablen HTTP_COOKIE, das Speicherformat ist wie folgt Cookie-Informationen gespeichert sind:

#!/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";

Das obige Beispiel Ausgabe lautet:

User ID = XYZ
Password = XYZ123

CGI-Modul

Perl-CGI viele Einbaumodul liefert, verwendet die beiden folgenden: