Tutorial Perl CGI Programming Terbaik Pada tahun 2024, Dalam tutorial ini Anda dapat mempelajari Apa CGI,web browsing,CGI Bagan,konfigurasi server web dan dukungan,HTTP header,Variabel CGI Lingkungan,download,Gunakan metode GET mentransfer data,Menggunakan metode POST untuk melewatkan data,,Radio transfer data via program CGI,transfer data textarea melalui program CGI,program CGI untuk melewatkan data melalui pull-down,CGI digunakan Cookie,pengaturan Cookie,modul CGI,
CGI saat ini dikelola oleh NCSA, NCSA CGI didefinisikan sebagai berikut:
CGI (Common Gateway Interface), Common Gateway Interface, yang merupakan program yang berjalan di server, seperti: HTTP server, antarmuka klien menyediakan halaman HTML yang sama.
Untuk lebih memahami bagaimana CGI bekerja, kita bisa klik pada link pada halaman web atau URL dari proses:
program CGI bisa menjadi script Python, naskah PERL, naskah SHELL, C atau C ++ program.
Sebelum Anda melakukan pemrograman CGI, pastikan bahwa server Web Anda telah dikonfigurasi untuk mendukung CGI dan CGI handler.
Apache mendukung konfigurasi CGI:
Mengatur direktori CGI:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
Semua HTTP server untuk mengeksekusi program CGI disimpan dalam direktori pra-dikonfigurasi. Direktori ini disebut direktori CGI, dan dengan konvensi, itu bernama / var / www / direktori cgi-bin.
File CGI ekstensi cgi, Perl juga dapat menggunakan ekstensi .pl.
Secara default, Linux server konfigurasi menjalankan direktori cgi-bin adalah / var / www.
Jika Anda ingin menentukan direktori yang berbeda untuk menjalankan script CGI, Anda dapat memodifikasi file konfigurasi httpd.conf sebagai berikut:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
Menambahkan akhiran .pl AddHandler, sehingga kita dapat mengakses akhir .pl file script Perl:
AddHandler cgi-script .cgi .pl .py
Di bawah ini kami membuat file test.cgi, kode tersebut adalah sebagai berikut:
#!/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;
Kemudian buka browser Anda ke http: //localhost/cgi-bin/test.cgi, hasil output adalah sebagai berikut:
Output dari baris pertama dari script "Content-type: text / html \ r \ n \ r \ n" dikirim ke browser dan memberitahu browser untuk menampilkan jenis konten "text / html".
isi file test.cgi di: bagian dari header HTTP adalah "Content-type text / html", itu akan dikirim ke jenis konten browser menceritakan file browser.
Format Header HTTP adalah sebagai berikut:
HTTP 字段名: 字段内容
Sebagai contoh:
Content-type:text/html\r\n\r\n
Tabel berikut menjelaskan informasi dalam program CGI HTTP header yang sering digunakan:
kepala | deskripsi |
---|---|
Konten-type: | entitas MIME sesuai dengan permintaan informasi. Sebagai contoh: Content-type: text / html |
Kedaluwarsa: Tanggal | Tanggal respon dan waktu berakhir |
Lokasi: URL | Untuk mengarahkan penerima untuk permintaan URL non-lokasi untuk menyelesaikan permintaan atau identifikasi sumber daya baru |
Terakhir diubah: Tanggal | sumber daya yang diminta terakhir diubah |
Konten-length: N | permintaan konten-Panjang |
Set-Cookie: String | pengaturan http Cookie |
Semua program CGI telah menerima variabel lingkungan berikut, yang memainkan peran penting dalam program CGI:
nama variabel | deskripsi |
---|---|
CONTENT_TYPE | Nilai ini menunjukkan bahwa variabel lingkungan dengan jenis MIME transfer informasi. Saat ini, variabel lingkungan umumnya CONTENT_TYPE: application / x-www-form-urlencoded, ia mengatakan bahwa data dari bentuk HTML. |
CONTENT_LENGTH | Jika modus transfer server dan program CGI informasi adalah POST, bahkan jika variabel lingkungan STDIN masukan jumlah byte yang dapat membaca data yang valid dari standar. variabel lingkungan ini ketika membaca data input harus digunakan. |
HTTP_COOKIE | konten COOKIE dalam klien. |
HTTP_USER_AGENT | Memberikan informasi termasuk nomor versi dari browser klien atau data kepemilikan lainnya. |
PATH_INFO | Nilai variabel lingkungan ini menunjukkan nama program CGI segera setelah informasi jalur tambahan. Ini sering muncul sebagai program argumen CGI. |
QUERY_STRING | Jika modus transfer server dan program CGI informasi adalah informasi GET, nilai variabel lingkungan ini bahkan jika berlalu. Informasi ini diikuti dengan nama program CGI, baik di tengah-tengah dengan tanda tanya '?' Separator. |
REMOTE_ADDR | Nilai variabel lingkungan ini adalah alamat IP dari klien mengirimkan permintaan, misalnya, 192.168.1.67 atas. Nilai ini selalu hadir. Dan itu adalah kebutuhan untuk menyediakan Web klien untuk identifier unik server Web dapat digunakan dalam program-program CGI untuk membedakan antara klien Web yang berbeda. |
REMOTE_HOST | Nilai variabel lingkungan ini berisi nama host dari klien meminta CGI. Jika tidak Anda ingin memeriksa, Anda tidak perlu mendefinisikan variabel lingkungan ini. |
REQUEST_METHOD | Ini menyediakan metode yang disebut skrip. Untuk HTTP script / 1.0 protokol hanya GET dan POST bermakna. |
SCRIPT_FILENAME | Path lengkap ke skrip CGI |
SCRIPT_NAME | Nama script CGI |
SERVER_NAME | Ini adalah nama host, alias, atau alamat IP dari server WEB Anda. |
SERVER_SOFTWARE | Nilai variabel lingkungan ini berisi panggilan CGI nama program dan versi jumlah server HTTP. Misalnya, nilai di atas Apache / 2.2.14 (Unix) |
Berikut ini adalah script CGI variabel lingkungan keluaran CGI sederhana:
#!/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;
Jika kita ingin mencapai melalui Perl download file CGI, memerlukan set yang berbeda dari informasi header sebagai berikut:
#!/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"); }
GET metode untuk mengirimkan informasi pengguna dikodekan ke server, data informasi yang terkandung dalam URL dari permintaan halaman ke nomor dibagi sebagai berikut "?":
http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2GET permintaan tentang beberapa komentar lain:
Berikut ini adalah URL sederhana, menggunakan metode GET untuk mengirimkan dua parameter program test.cgi:
/cgi-bin/test.cgi?name=本教程&url=http://www.w3write.com
Sebuah file kode 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/%(id)/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;
Periksa browser Anda, hasil output adalah sebagai berikut:
Berikut ini adalah dua mengirim data ke server menggunakan metode GET melalui form HTML, diserahkan dokumen test.cgi skrip server yang sama, kode test adalah sebagai berikut:
<!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>
pelaksanaan browser hasil adalah sebagai berikut:
Menggunakan metode POST untuk melewatkan data ke server yang lebih aman dan dapat diandalkan, karena beberapa informasi sensitif seperti password pengguna harus menggunakan POST untuk mentransfer data.
Berikut ini juga test.cgi, juga dapat menangani data formulir POST disampaikan oleh browser:
#!/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/%(id)/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;
Berikut ini adalah dua mengirim data ke server menggunakan metode GET melalui form HTML, diserahkan dokumen test.cgi skrip server yang sama, kode test adalah sebagai berikut:
<!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>
pelaksanaan browser hasil adalah sebagai berikut:
checkbox digunakan untuk mengirimkan satu atau lebih data pilihan, kode test adalah sebagai berikut:
<!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>
Sebuah file kode 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/%(id)/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;
pelaksanaan browser hasil adalah sebagai berikut:
Radio hanya mentransfer data ke server, kode test adalah sebagai berikut:
<!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>
kode script test.cgi adalah sebagai berikut:
#!/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/%(id)/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;
pelaksanaan browser hasil adalah sebagai berikut:
Textarea lulus beberapa baris data ke server, kode test adalah sebagai berikut:
<!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"> 在这里输入内容id. </textarea> <input type="submit" value="提交" /> </form> </body> </html>
kode script test.cgi adalah sebagai berikut:
#!/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/%(id)/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;
pelaksanaan browser hasil adalah sebagai berikut:
HTML kode kotak drop-down sebagai berikut:
<!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>
kode script test.cgi sebagai berikut:
#!/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/%(id)/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;
pelaksanaan browser hasil adalah sebagai berikut:
protokol http dalam kelemahan besar yang salah untuk menilai identitas pengguna, yang memberikan programmer banyak ketidaknyamanan, tetapi tampaknya fungsi cookie yang dibuat untuk kekurangan ini.
cookie yang mengakses script sedangkan pelanggan melalui browser pelanggan pada hard disk klien untuk menulis catatan data, mengambil data ketika pelanggan mengunjungi script berikutnya, sehingga mencapai fungsi menentukan identitas, kue yang biasa digunakan dalam memverifikasi identitas.
Cookie http dikirim melalui header http untuk mencapai, ia harus mentransfer file, sintaks sundulan set-Cookie adalah sebagai berikut:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
pengaturan cookie sangat sederhana, kue akan dikirim secara terpisah di http header. Contoh berikut menetapkan UserID, Password dan berakhir di 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"; ididididid.其他 HTML 内容
Cookie halaman pencarian informasi sangat sederhana, dalam CGI variabel lingkungan HTTP_COOKIE, format penyimpanan adalah sebagai berikut informasi Cookie disimpan:
#!/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";
Contoh di atas output:
User ID = XYZ Password = XYZ123
Perl CGI menyediakan banyak built-in modul, digunakan dua berikut: