Latest web development tutorials

بيرل CGI البرمجة

ما هو CGI

CGI يحتفظ بها حاليا التقييم الذاتي، يتم تعريف التقييم الذاتي CGI على النحو التالي:

CGI (واجهة العبارة الشائعة)، واجهة العبارة الشائعة، وهو برنامج يعمل على الخادم، مثل: ملقم HTTP، واجهة العميل توفير نفس صفحة HTML.


تصفح الإنترنت

لفهم أفضل لكيفية يعمل CGI، يمكننا أن تنقر على وصلة على صفحة ويب أو URL من هذه العملية:

  • 1، استخدام المتصفح للوصول إلى URL والاتصال إلى ملقم HTTP على شبكة الإنترنت.
  • 2، يتلقى ملقم ويب سيتم تحليل رسالة طلب URL وتبدو الوصول إلى الملفات على الخادم إذا كان هناك، إذا كان هناك للعودة محتويات الملف، وإلا فإنها ترجع رسالة خطأ.
  • 3، يتلقى متصفح المعلومات من الخادم ويعرض الملف أو خطأ الرسائل الواردة.

ويمكن لبرامج CGI يكون السيناريو بيثون، المخطوطة، شيل، C أو C ++ البرامج.


CGI الرسم البياني

cgiarch


تكوين خادم الويب والدعم

قبل إجراء البرمجة CGI، تأكد من أنه قد تم تكوين ملقم ويب لدعم CGI ومعالج CGI.

أباتشي يدعم التكوين CGI:

إعداد دليل CGI:

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

يتم تخزين كل ملقم HTTP لتنفيذ برامج CGI في دليل تكوين مسبقا. ويسمى هذا الدليل الدليل CGI، والمؤتمرات، وأطلق عليها اسم / فار / على شبكة الاتصالات العالمية / الدليل-CGI بن.

ملف CGI تمديد .cgi، بيرل يمكن أيضا استخدام ملحق .PL.

افتراضيا، تكوين الملقم تشغيل لينكس دليل CGI بن هو / فار / على شبكة الاتصالات العالمية.

إذا كنت ترغب في تحديد دليل آخر لتشغيل البرامج النصية CGI، يمكنك تعديل ملف تكوين ملف httpd.conf على النحو التالي:

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

إضافة لاحقة .PL AddHandler، حتى نتمكن من الوصول إلى نهاية الملف النصي بيرل .PL:

AddHandler cgi-script .cgi .pl .py

برنامج CGI الأول

أدناه ونحن إنشاء ملف test.cgi، رمز على النحو التالي:

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

ثم فتح المتصفح الخاص بك إلى http: //localhost/cgi-bin/test.cgi، نتائج الإخراج هي كما يلي:

إخراج السطر الأول من النص "نوع المحتوى: نص / HTML \ ص \ ن \ ص \ ن" يتم إرسالها إلى المتصفح وتخبر المتصفح لعرض نوع المحتوى "نص / أتش تي أم أل".


رأس HTTP

محتويات الملف test.cgi في: جزء من رأس HTTP هي "نوع المحتوى النص / أتش تي أم أل"، وسوف يتم إرسالها إلى نوع محتوى المتصفح يحكي ملفات المتصفح.

شكل رأس HTTP هو على النحو التالي:

HTTP 字段名: 字段内容

على سبيل المثال:

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

يصف الجدول التالي وغالبا ما تستخدم هذه المعلومات في برامج CGI رأس HTTP:

رئيس وصف
المحتوى من نوع: كيان MIME المقابلة لطلب المعلومات. على سبيل المثال: نوع المحتوى: نص / HTML
ينتهي: التاريخ تاريخ استجابة والوقت انتهى
الموقع: URL لإعادة توجيه المتلقي لطلب URL غير موقع لإتمام الطلب أو تحديد موارد جديدة
آخر تعديل: التاريخ المورد المطلوب آخر تعديل
المحتوى طول: N طلب محتوى طول
تعيين ملف تعريف الارتباط: سلسلة إعدادات المتشعب كوكي

متغيرات البيئة CGI

وقد تلقى جميع برامج CGI متغيرات البيئة التالية، التي لعبت دورا مهما في برنامج CGI:

اسم المتغير وصف
CONTENT_TYPE تشير هذه القيمة إلى متغير البيئة لنوع MIME نقل المعلومات. في الوقت الحاضر، ومتغيرات البيئة بشكل عام CONTENT_TYPE: وقال urlencoded س-وو-شكل التطبيق / أن البيانات من النموذج HTML.
CONTENT_LENGTH إذا كانت المعلومات الخادم واسطة نقل وبرنامج CGI هي وظيفة، حتى لو كانت بيئة متغيرة STDIN إدخال عدد البايتات التي يمكن قراءة بيانات صالحة من هذا المعيار. هذا متغير البيئة عند قراءة البيانات المدخلة يجب استخدامها.
HTTP_COOKIE المحتوى كوكي ضمن العميل.
HTTP_USER_AGENT توفير المعلومات يتضمن رقم الإصدار من متصفح العميل أو بيانات الملكية الأخرى.
PATH_INFO قيمة متغير البيئة هذا يشير إلى اسم البرنامج CGI مباشرة بعد معلومات المسار إضافية. في كثير من الأحيان يبدو كبرنامج حجة CGI.
QUERY_STRING إذا كانت المعلومات الخادم واسطة نقل وبرنامج CGI هي المعلومات GET، وقيمة هذا المتغير البيئة حتى لو مرت. ويتبع هذه المعلومات من قبل اسم البرنامج CGI، سواء في الوسط مع علامة استفهام "؟" فاصل.
REMOTE_ADDR قيمة متغير البيئة هذا هو عنوان IP للعميل يرسل الطلب، على سبيل المثال، 192.168.1.67 أعلاه. هذه القيمة هي دائما موجودة. وهو الحاجة إلى توفير عميل ويب لمعرف فريد ملقم ويب يمكن استخدامها في برامج CGI للتمييز بين عميل ويب مختلفة.
REMOTE_HOST تحتوي على قيمة هذا المتغير بيئة اسم المضيف للعميل طلب من المجموعة الاستشارية لاندونيسيا. إذا كان لا تريد التحقق، لا تحتاج إلى تعريف هذا المتغير البيئة.
REQUEST_METHOD أنه يوفر طريقة تسمى النصي. لHTTP النصي / بروتوكول 1.0 فقط الحصول على وظيفة ذات مغزى.
SCRIPT_FILENAME المسار الكامل لنصوص CGI
البرمجي اسم البرنامج النصي CGI
SERVER_NAME هذا هو اسم المضيف، اسم مستعار، أو عنوان IP لخادم الويب الخاص بك.
SERVER_SOFTWARE تحتوي على قيمة متغير البيئة هذا اسم البرنامج دعوة CGI ورقم الإصدار خادم HTTP. على سبيل المثال، فإن القيمة أعلاه من طراز أباتشي / 2.2.14 (يونكس)

هنا هو بسيط متغيرات البيئة الناتج CGI النصي 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;

التنزيلات

إذا أردنا أن نحقق من خلال بيرل تحميل الملفات CGI، تتطلب مجموعة مختلفة من معلومات رأس على النحو التالي:

#!/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 لنقل البيانات

الحصول على طريقة لإرسال معلومات المستخدم المشفرة إلى خادم، يرد المعلومات والبيانات في URL طلب الصفحة إلى عدد مقسمة على النحو التالي "؟":

http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
طلبات GET حول بعض التعليقات الأخرى:
  • طلب GET يمكن أن يكون مؤقتا
  • يبقى طلب GET في تاريخ المتصفح
  • GET طلبات يمكن وضع إشارة
  • GET طلبات لا ينبغي أن تستخدم عند التعامل مع بيانات حساسة
  • طلبات GET لها قيود طول
  • GET ينبغي أن تستخدم طلبات فقط لاسترداد البيانات

أمثلة على رابط بسيط: GET طريقة

ما يلي هو عنوان بسيط، وذلك باستخدام طريقة GET لإرسال اثنين من المعلمات لبرنامج test.cgi:

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

ملف كود 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;

تحقق المتصفح الخاص بك، نتائج الإخراج هي كما يلي:

ومن الأمثلة على نموذج بسيط: GET طريقة

وفيما يلي اثنين من إرسال البيانات إلى الخادم باستخدام طريقة GET عبر نموذج HTML، قدمت الوثيقة نفسها test.cgi النصي الملقم، test.html متاحة على النحو التالي:

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

تنفيذ متصفح النتائج على النحو التالي:


استخدام الأسلوب POST لتمرير البيانات

استخدام الأسلوب POST لتمرير البيانات إلى الخادم هو أكثر أمنا وموثوق بها، وبعض المعلومات الحساسة مثل كلمات السر حاجة المستخدم لاستخدام وظيفة لنقل البيانات.

وفيما يلي 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;
}
$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;

وفيما يلي اثنين من إرسال البيانات إلى الخادم باستخدام طريقة GET عبر نموذج HTML، قدمت الوثيقة نفسها test.cgi النصي الملقم، test.html متاحة على النحو التالي:

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

تنفيذ متصفح النتائج على النحو التالي:

برنامج CGI لتمرير البيانات من خلال مربع

مربع تستخدم لتقديم واحد أو أكثر من البيانات الخيار، test.html متاحة على النحو التالي:

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

ملف كود 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;

تنفيذ متصفح النتائج على النحو التالي:


الراديو لنقل البيانات عن طريق برنامج CGI

راديو فقط نقل البيانات إلى ملقم، test.html متاحة على النحو التالي:

<!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 على النحو التالي:

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

تنفيذ متصفح النتائج على النحو التالي:


نقل البيانات ناحية النص عبر برنامج CGI

تمريرة ناحية النص صفوف متعددة من البيانات إلى الخادم، test.html متاحة على النحو التالي:

<!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 على النحو التالي:

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

تنفيذ متصفح النتائج على النحو التالي:


برنامج CGI لتمرير البيانات من خلال المنسدلة

HTML كود المربع المنسدل على النحو التالي:

<!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 على النحو التالي:

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

تنفيذ متصفح النتائج على النحو التالي:


يستخدم CGI كوكي

بروتوكول HTTP في العيب الكبير هو الخطأ الحكم على هوية المستخدم، والتي تعطي المبرمجين قدرا كبيرا من الإزعاج، ولكن يبدو ظيفة ملفات تعريف الارتباط يعوض عن هذا النقص.

كعك أن يتم الوصول إلى النصي في حين أن العملاء من خلال متصفح العميل على القرص الثابت العميل لكتابة سجلات البيانات واسترجاع البيانات عندما يزور العميل النصي المقبل، وذلك لتحقيق وظيفة تحديد الهوية، الكعكة التي يشيع استخدامها في التحقق من الهوية.

تركيب كوكي

يتم إرسال الكوكيز المتشعب من خلال رأس HTTP لتحقيق، كان عليه أن نقل الملفات، جملة رأس تعيين ملف تعريف الارتباط على النحو التالي:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • اسم = اسم: لضبط قيمة ملف تعريف الارتباط (لا يمكن أن تستخدم اسم ""؛ و "،" رقم)، عندما تكون هناك قيم اسم متعددة "،" للفصل، على سبيل المثال: NAME1 = NAME1. NAME2 = NAME2 . NAME3 = NAME3.
  • تنتهي = التاريخ: كوكي تاريخ انتهاء الصلاحية في الشكل: تنتهي = "Wdy، DD- الاثنين-YYYY HH: MM: SS"
  • مسار = مسار: لتعيين مسار دعم الكوكي، إذا كان المسار هو مسار، ملفات تعريف الارتباط لكافة الملفات والدلائل من إدخال دليل حيز التنفيذ، على سبيل المثال: مسار = "/-CGI بن /"، إذا كان المسار ملف، كوكي ويشير إلى بدء نفاذ هذا الملف، على سبيل المثال: مسار = "/-CGI بن / cookie.cgi".
  • المجال = المجال: اسم المجال من الكعكة صالح، على سبيل المثال: مجال = "www.w3big.com"
  • تأمين: إذا تم إعطاء هذا العلم، أن الكعكة يمكن أن ينتقل إلا عن طريق الخادم بروتوكول https SSL.
  • استلام الكعكة من خلال إعداد متغيرات البيئة HTTP_COOKIE تحقيقه، برامج CGI يمكن الحصول على المعلومات عن طريق استرداد متغير الكعكة.

إعدادات ملفات تعريف الارتباط

هو بسيط جدا، سيتم إرسال إعدادات ملفات تعريف الارتباط الكوكيز بشكل منفصل في رأس HTTP. يقوم المثال التالي من هوية المستخدم، كلمة المرور وتنتهي في الكعكة:

#!/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 内容

البحث كوكي

كوكي الصفحة استرجاع المعلومات بسيطة جدا، في CGI متغيرات البيئة HTTP_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";

إخراج المثال أعلاه هو:

User ID = XYZ
Password = XYZ123

وحدة CGI

بيرل CGI يوفر العديد من وحدة مدمجة، وتستخدم التاليين: