Latest web development tutorials

Perl CGI Programowanie

Co to jest CGI

CGI jest utrzymywane przez NCSA NCSA CGI jest zdefiniowany w następujący sposób:

CGI (Common Gateway Interface), Common Gateway Interface, który to program uruchomiony na serwerze, na przykład: Serwer HTTP, interfejs kliencki z tej samej strony HTML.


przeglądanie stron internetowych

Aby lepiej zrozumieć, jak działa CGI, możemy kliknąć na link na stronie internetowej lub adresu URL procesu:

  • 1, należy użyć przeglądarki, aby uzyskać dostęp do adresu URL i podłączyć do serwera HTTP.
  • 2, serwer sieci Web odbiera komunikat żądania będą przetwarzane URL i wyszukać pliki dostępne na serwerze, jeśli istnieje, jeśli istnieje, aby przywrócić zawartość pliku, w przeciwnym wypadku zwraca komunikat o błędzie.
  • 3, przeglądarka otrzymuje informacje z serwera i wyświetla otrzymane wiadomości plików lub błędów.

Programy CGI może być skrypt Python, Perl skrypt, skrypt powłoki, C lub C ++ programy.


Wykres CGI

cgiarch


Konfiguracja serwera WWW i wsparcie

Przed przeprowadzić programowanie CGI, upewnij się, że serwer WWW został skonfigurowany do obsługi CGI oraz obsługi CGI.

Apache obsługuje konfigurację CGI:

Konfigurowanie katalogu CGI:

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

Wszystkie serwer HTTP w celu wykonania programów CGI są zapisywane we wstępnie skonfigurowane katalogu. Ten katalog jest nazywany katalogu CGI, a zgodnie z przyjętą konwencją, to nazywa się w katalogu / var / www / cgi-bin.

Plik rozszerzenie .cgi CGI, Perl może także używać rozszerzenia .pl.

Domyślnie konfiguracja serwera Linux działa katalogu cgi-bin jest / var / www.

Jeśli chcesz określić inny katalog do uruchamiania skryptów CGI, można zmodyfikować plik konfiguracyjny httpd.conf w następujący sposób:

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

Dodaj przyrostek .pl AddHandler, dzięki czemu możemy uzyskać dostęp do końcówkę .pl skryptu Perl:

AddHandler cgi-script .cgi .pl .py

Pierwszy program CGI

Poniżej utworzyć plik test.cgi, kod jest w następujący sposób:

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

Następnie otwórz przeglądarkę http: //localhost/cgi-bin/test.cgi, wyniki wyjściowe są następujące:

Wyjście z pierwszej linii skryptu "Content-Type: text / html \ r \ n \ r \ n" zostanie wysłana do przeglądarki i powiedzieć, że przeglądarka wyświetli typu zawartości "text / html".


nagłówek HTTP

Zawartość pliku test.cgi w: część nagłówka HTTP jest "Content-type text / html", zostanie ona wysłana do typu zawartości przeglądarka informuje pliki przeglądarki.

Format nagłówek HTTP jest następujący:

HTTP 字段名: 字段内容

Na przykład:

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

Poniższa tabela przedstawia informacje w programach CGI nagłówka HTTP są często używane:

głowa opis
Content-type: Podmiot MIME odpowiadające żądanie informacji. Na przykład: Content-Type: text / html
Wygasa: Data data i czas reakcji wygasł
Lokalizacja: URL Aby przekierować odbiorcę na żądanie zakaz lokalizacji URL o uzupełnienie wniosku lub identyfikacji nowych zasobów
Last modified: Data Żądany zasób został ostatnio modyfikowany
Content-Length: N Żądanie Content-Length
Set-Cookie: String Ustawienia HTTP Cookie

Zmienne środowiskowe CGI

Wszystkie programy CGI otrzymały następujące zmienne środowiskowe, które odegrały ważną rolę w programie CGI:

Nazwa zmiennej opis
CONTENT_TYPE Wartość ta wskazuje, że zmiennej środowiskowej do typu MIME przekazywania informacji. Obecnie, zmienne środowiskowe są zwykle CONTENT_TYPE: application / x-www-form-urlencoded, powiedział, że dane z formularza HTML.
CONTENT_LENGTH Jeśli informacje Serwer tryb transferu i program CGI jest POST, nawet jeśli zmienna środowiskowa wejścia STDIN liczba bajtów, które można odczytać aktualne dane z normą. Ta zmienna podczas odczytu danych wejściowych muszą być użyte.
HTTP_COOKIE Zawartość COOKIE w kliencie.
HTTP_USER_AGENT Dostarczanie informacji zawiera numer wersji przeglądarki klienta lub innych poufnych danych.
PATH_INFO Wartość tej zmiennej środowiskowej wskazuje nazwę programu CGI natychmiast po informacji dodatkowej ścieżki. często pojawia się on jako program CGI argumentem.
QUERY_STRING Jeśli informacje Serwer tryb transferu i program CGI jest informacja GET, wartość tej zmiennej środowiskowej nawet jeśli minął. Informacje te są następnie nazwę programu CGI, zarówno w środku ze znakiem zapytania "?" Separatora.
REMOTE_ADDR Wartość tej zmiennej środowiskowej jest adres IP klienta wysyła żądanie, na przykład, powyższa 192.168.1.67. Wartość ta jest zawsze obecny. I to jest konieczność zapewnienia klient internetowy unikalnego identyfikatora serwera sieci Web mogą być wykorzystane w programach CGI odróżnić innego klienta sieci Web.
REMOTE_HOST Wartość tej zmiennej środowiskowej zawiera nazwę hosta żądającego klienta CGI. Jeśli nie chcesz, by sprawdzić, nie trzeba zdefiniować tę zmienną.
REQUEST_METHOD Zapewnia metody nazywanej skrypt. Dla scenariusza HTTP / 1.0 protokołu tylko GET i POST znaczące.
SCRIPT_FILENAME Pełna ścieżka do skryptów CGI
SCRIPT_NAME Nazwa skryptu CGI
SERVER_NAME Jest to nazwa hosta, alias lub adres IP serwera sieci Web.
SERVER_SOFTWARE Wartość tej zmiennej środowiskowej zawiera wywołanie CGI nazwę programu i numer wersji serwera HTTP. Na przykład, powyższa wartość Apache / 2.2.14 (Unix)

Oto prosty skrypt CGI zmienne środowiskowe CGI wyjście:

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

pliki do pobrania

Jeśli chcemy osiągnąć poprzez CGI Perl pobierania plików, wymaga innego zestawu informacji nagłówka w następujący sposób:

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

Za pomocą metody GET przesyłania danych

GET do wysyłania zakodowanych danych użytkownika do serwera, dane informacyjne jest zawarty w adresie URL żądania strony do liczby dzielą się na "?":

http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
GET wnioski dotyczące niektórych innych uwag:
  • GET Żądanie to może być buforowane
  • Żądanie GET pozostaje w historii przeglądarki
  • GET wnioski mogą być zakładka
  • GET żądania nie powinny być wykorzystywane w kontaktach z danych wrażliwych
  • GET wnioski mają ograniczenia długości
  • GET wnioski powinny być stosowane wyłącznie do pobierania danych

Przykłady prostych url: Get metody

Poniżej znajduje się prosty URL, używając metody GET wysłać dwóch parametrów programu test.cgi:

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

Plik Kod 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;

Sprawdź swoją przeglądarkę, wyniki wyjściowe są następujące:

Przykłady prostej formie: Get metody

Poniżej przedstawiono dwa wysłać dane do serwera za pomocą metody GET za pośrednictwem formularza HTML, przedstawiony ten sam dokument test.cgi skryptu serwera test.html kod jest w następujący sposób:

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

Realizacja przeglądarka wyniki jest następująca:


Za pomocą metody POST, aby przekazać dane

Korzystanie z metody POST, aby przekazać dane do serwera jest bardziej bezpieczne i niezawodne, jak niektórzy poufnych informacji, takich jak hasła użytkownika należy użyć POST do przesyłania danych.

Poniżej znajduje również test.cgi, może również obsługiwać POST dane formularzy złożonych przez przeglądarkę:

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

Poniżej przedstawiono dwa wysłać dane do serwera za pomocą metody GET za pośrednictwem formularza HTML, przedstawiony ten sam dokument test.cgi skryptu serwera test.html kod jest w następujący sposób:

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

Realizacja przeglądarka wyniki jest następująca:

Program CGI do przekazywania danych za pośrednictwem wyboru

pole wykorzystywane do przedstawienia jednego lub więcej danych opcji, test.html kod jest w następujący sposób:

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

Plik Kod 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;

Realizacja przeglądarka wyniki jest następująca:


transfer danych Radio poprzez program CGI

Radiowego przesyłania danych tylko do serwera test.html kod jest następujący:

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

Kod skryptu test.cgi przedstawia się następująco:

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

Realizacja przeglądarka wyniki jest następująca:


textarea transferu danych przez program CGI

Textarea przekazać wiele wierszy danych do serwera, test.html kod jest w następujący sposób:

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

Kod skryptu test.cgi przedstawia się następująco:

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

Realizacja przeglądarka wyniki jest następująca:


Program CGI do przekazywania danych za pośrednictwem rozwijanej

Kod HTML pole rozwijane w sposób następujący:

<!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 kod skryptu w następujący sposób:

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

Realizacja przeglądarka wyniki jest następująca:


CGI służy Cookie

Protokół HTTP w wielkim wadą jest źle ocenić tożsamości użytkownika, które dają programistom wiele niedogodności, ale wydaje funkcjonalności cookies nadrabiał ten niedobór.

cookies, które uzyskuje dostęp do skryptu, a klient przez przeglądarkę klienta na kliencie twardym pisać rekordy danych, pobieranie danych, gdy klient odwiedza kolejny skrypt, tak aby osiągnąć funkcję określania tożsamości, ciasteczka powszechnie stosowane przy weryfikacji tożsamości.

Składnia cookies

Http cookie jest wysyłane za pośrednictwem nagłówka HTTP osiągnąć, musiał przesyłać pliki, składni header set-Cookie to w następujący sposób:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = nazwa: ustawić wartość cookie (nazwa nie może być używany "," i "," numer), gdy istnieje wiele wartości name ";" aby oddzielić, na przykład: nazwa1 = nazwa1, nazwa2 = name2 ; NAME3 = NAME3.
  • wygasa = data: ciasteczka datę ważności w formacie: wygaśnięcia = "Wdy, DD- MMM-YYYY HH: MM: SS"
  • path = ścieżka: ścieżka ustawić obsługę ciasteczek, jeśli ścieżka jest ścieżką, cookie dla wszystkich plików i podkatalogów pozycji katalogu w życie, na przykład: path = "/ cgi-bin /", jeśli ścieżka jest plik, cookie to odnosi się do wejścia w życie tego pliku, na przykład: path = "/ cgi-bin / cookie.cgi".
  • domain = Domena: nazwa domeny cookie jest ważny, na przykład: domena = "www.w3big.com"
  • zabezpieczenie: Jeśli ta flaga jest podane, że ciasteczka mogą być przesyłane wyłącznie za pośrednictwem protokołu SSL serwera https.
  • Cookie jest odbierany przez ustawienie zmiennych środowiskowych HTTP_COOKIE osiągnięty, programy CGI mogą uzyskać informacje, pobierając zmienną cookie.

ustawienia cookies

Ustawienia cookies jest bardzo prosta, ciasteczko zostanie wysłane osobno w nagłówku HTTP. Poniższy przykład ustawia identyfikator użytkownika, hasło i wygasa w pliku 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 内容

Znajdź Cookie

Cookie stronę wyszukiwania informacji jest bardzo proste, w CGI Zmienne środowiskowe HTTP_COOKIE, format przechowywania jest następująca informacja jest przechowywana Cookie:

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

Powyższy przykład wyjście jest:

User ID = XYZ
Password = XYZ123

moduł CGI

Perl CGI zapewnia wiele wbudowanych modułów, wykorzystywane następujących dwóch kryteriów: