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
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>本教程(w3write.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=value2GET-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.w3write.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/%(de)/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>本教程(w3write.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 Code wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/%(de)/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>本教程(w3write.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 Code wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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 Code wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/%(de)/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>本教程(w3write.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 Code ist wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.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/%(de)/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>本教程(w3write.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 Code wie folgt:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3write.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容de. </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/%(de)/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>本教程(w3write.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>本教程(w3write.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/%(de)/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>本教程(w3write.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.w3write.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.w3write.com;\n"; print "Set-Cookie:Path=/perl;\n"; print "Content-type:text/html\r\n\r\n"; dedededede.其他 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: