ถาม-ตอบ เรื่อง CGI (FAQ)

คำถามเบี้องต้น

หัวข้อนี้จะมีเฉพาะคำถามที่เป็นพื้นฐานของ CGI และการเขียนโปรแกรมสำหรับ web และคำถามและคำตอบที่ไม่ตรงกับหัวข้ออื่น

1.1 CGI คืออะไร?

CGI ไม่ใช่ภาษา ไม่ใช่โปรแกรม!! มีหลายคนที่สับสนคิดว่า CGI คือโปรแกรมภาษา Perl! เมื่อกล่าวถึง CGI มีหลายคนที่คิดว่าคือโปรแกรมภาษา Perl และอีกหลายคนที่คิดว่าโปรแกรมภาษา Perl คือ CGI ?!?

CGI ไม่ใช่ภาษาโปรแกรม CGI เป็นโปรโตคอลที่ใช้ในการติดต่อระหว่าง browser ตัว server และตัวโปรแกรม gateway (หรือที่เรียกกันว่า CGI script) ซึ่งอาจจะเขียนขึ้นด้วยภาษาอะไรก็ได้ที่สามารถติดต่อกับ stdin, stdout และ ตัวแปร environment ของระบบได้

CGI (Common Gateway Interface) เป็นการ interface ระหว่าง server และ โปรแกรม 'gateway' ภายใน server CGI จะเป็นตัวกำหนดว่าข้อมูลจะส่งไปยัง โปรแกรม gateway ยังไง และ ข้อมูลจะถูกส่งกลับมาโดยโปรแกรม gateway อย่างไร ภายใน server และกลับไปยัง browser

 

1.2 เมื่อไหร่ที่จะต้องใช้ CGI?
 

คำตอบค่อนข้างจะกว้าง แต่คร่าวก็คือเมื่อต้องการที่จะทำให้เกิดการตอบสนองกับผู้มาเยี่ยมชมโฮมเพจ เมื่อต้องการจะทำงานที่เกี่ยวกับฐานข้อมูล หรือประมวลผลข้อมูล นอกเสียจากการนำเสนอข้อมูลในรูปแบบของเวปเพจเพียงอย่างเดียว

1.3 จะใช้อะไรดีระหว่าง CGI กับ Java?

โดยพื้นฐาน CGI กับ Java นั้นแตกต่างกัน CGI เป็นโปรโตคอลที่ทำงานบน web server ส่วน Java เป็นภาษาที่ใช้ในการเขียนโปรแกรมภาษาหนึ่ง Java ถูกออกแบบมาเพื่อเป็นภาษาสำหรับเขียน network application โปรแกรมภาษา Java จะทำงานบนเครื่อง client และสามารถติดต่อกับเครื่อง server ได้ โปรแกรมภาษา Java สามารถทำงานได้บน browsers หลายๆอย่าง (เช่น netscape) (โปรแกรมภาษา Java ที่ทำงานบน browser เรียกว่า Applet) ทั้ง CGI และ Java สามารถทำงานร่วมกันได้ เช่น ใช้ Java applet เป็นตัวนำเสนอข้อมูลที่ได้จากการประมวลผลของ CGI และใช้ CGI เก็บข้อมูลที่ได้รับจากการทำงานของ Java applet

 

1.4 จำเป็นไหมว่าจะต้องใช้ภาษา Perl?

 

ไม่! ในการเขียนโปรแกรมสำหรับ CGI คุณสามารถใช้ภาษาโปรแกรมได้หลายภาษา Perl เป็นภาษาที่ง่ายและมีคนนิยมใช้กันมาก แต่ก็ยังมีภาษาอื่นๆอีกมากมายเช่น C, C++, TCL, Basic หรือแม้แต่ shell script ก็สามารถใช้เขียนโปรแกรมสำหรับ CGI ได้

1.5 แล้วจะใช้ภาษาอะไรดี?

 

จะเลือกใช้ภาษาอะไร ขึ้นอยู่กับความสะดวกของคุณเอง เลือกดูจากความยากง่ายในการทำความเข้าใจกับภาษานั้นๆ และข้อดีข้อเสียของแต่ละภาษา และที่สำคัญ! เลือกภาษาที่ server คุณสนับสนุน ถ้าหากว่าเขียนเสร็จแล้วไม่สามารถใช้กับ server ได้ก็ไม่มีประโยชน์

1.6 จำเป็นไหมว่าจะต้องนำโปรแกรม CGI ไปไว้ใน directory ที่ชื่อ cgi-bin ?

 

ขึ้นอยู่กับ server ที่คุณใช้ คำถามนี้ผู้ดูแลระบบของคุณจะตอบได้ดีที่สุด(ผู้ดูแลไม่รู้แล้วใครจะรู้?;)

1.7 จำเป็นไหมว่าจะต้องตั้งนามสกุลไฟล์เป็น .pl หรือ .cgi ?

 

เหมือนกับคำถามข้อที่แล้ว มันขึ้นอยู่กับ server ที่คุณใช้ คำถามนี้ผู้ดูแลระบบของคุณจะตอบได้ดีที่สุด ถ้าคุณเป็นผู้แลระบบเองก็ให้อ่านดูจากคู่มือการใช้งาน

 

จะทำยังไง..?

หัวข้อนี้จะมีลูกเล่นเล็กๆน้อยๆปนๆอยู่ กับพวกคำถามที่มีคำตอบว่า "ไม่สามารถทำได้" และเหตุผลที่ว่า "ทำไมถึงไม่ได้"

2.1 สามารถจะเก็บข้อมูลเกี่ยวกับผู้ที่เข้ามาดูได้หรือไม่?

 

สำหรับข้อมูลว่าคนนั้นเป็นใครมาจากไหน e-mail อะไร บ้านอยู่ที่ไหน ไม่สามารถที่จะตรวจสอบได้ *ยิ้ม* เราจะทราบเฉพาะข้อมูลเล็กๆน้อยๆ เช่น ผู้ใช้ใช้โปรแกรม browser อะไรรุ่นไหน (อาจจะทราบ OS ที่ใช้ได้จากส่วนนี้ด้วยเช่นกัน) ผู้ใช้มี IP address ขณะนั้นว่าอะไร เป็นต้น

2.2 สามารถจะทราบ e-mail ของผู้ที่เข้ามาดูได้หรือไม่?

ไม่! อย่างมากก็ทราบแค่ว่ามาจาก IP หรือเครื่องๆไหน โดยดูจาก REMOTE_ADDR และ REMOTE_HOST ในตัวแปร environment การใช้ "finger@" เข้าช่วยเป็นเทคนิคที่ไม่มีประสิทธิภาพ ผลลัพธ์ที่ได้ไม่ถูกต้อง และยังทำให้โปรแกรม CGI ทำงานช้าอีกด้วย ทางออกที่ดีและมีมารยาทที่สุดก็คือ ทำแบบสอบถามให้ผู้ที่เข้าเยี่ยมชมกรอก โดยปกติแล้ว web browser จะป้องกันในส่วนนี้ไว้ไม่ให้ข้อมูลอันเป็นส่วนตัวของผู้ใช้เช่น e-mail ถูกนำไปใช้โดยไม่ได้อนุญาต ถ้าหากมีการตรวจสอบพบว่า browser ไหนที่มีช่องโหว่ทำให้ข้อมูลส่วนตัวเหล่านี้หลุดรอดออกไป ก็จะถูกแจ้งไปยังผู้พัฒนาโปรแกรม browser เพื่อทำการแก้ไขในทันที

 

2.3 สามารถจะทราบชื่อหรือ IP address ของเครื่องของผู้ที่เข้ามาดูได้หรือไม่?

 

ได้..แต่ไม่เสมอไป ถ้าเครื่องของผู้ที่เข้าชมมีชื่อ ก็สามารถตรวจสอบได้จาก REMOTE_HOST ในตัวแปร environment แต่ทุก IP address ไม่จำเป็นต้องมีชื่อเครื่อง(hostname) กรณีเช่น IP address ที่กำหนดให้กับผู้ใช้ที่โทรเข้ามาใช้งาน ISP ซึ่งมีผู้ใช้จำนวนมากและมี IP address หลายชุด บาง ISP อาจจะไม่ได้กำหนดชื่อเครื่องไว้ทุก IP address โดยปกติ web server จะไม่ทำการตรวจสอบชื่อเครื่องที่เข้ามาขอใช้บริการ ถ้าไม่มีการบอกชื่อเครื่องมาก็จะ IP address ในการติดต่อ ไม่จำเป็นจะต้องตรวจสอบชื่อเครื่อง ในกรณีนี้คุณสามารเขียนโปรแกรมเฉพาะสำหรับตรวจสอบชื่อเครื่องได้เอง แต่เป็นความยุ่งยากและไม่จำเป็นเสียเวลาโดยใช่เหตุ.. ที่บอกว่าเสียเวลาโดยใช่เหตุก็เพราะในบางครั้งผู้ที่เข้ามาเยี่ยมชมใช้ proxy ดังนั้นชื่อเครื่องที่คุณจะได้ก็คือชื่อเครื่องของ proxy server ไม่ใช่ชื่อเครื่องของผู้เข้าชมแต่อย่างใด

2.4 สามารถที่จะทราบรายละเอียดของ browser และแสดงหน้าต่างๆกันขึ้นอยู่กับ browser ได้หรือไม่?

ได้.. สามารถตรวจสอบรายละเอียด(เบื้องต้น)ของ browser ได้จาก HTTP_USER_AGENT ในตัวแปร environment โปรดระวังในเรื่องนี้ซักนิด เพราะอาจจะทำให้เกิดผลลัพธ์ที่ผิดพลาดก็ได้ ทุก User Agent ไม่จำเป็นว่าจะต้องเป็น browser (อาจจะเป็น spider bot ของ search engine , โปรแกรม offline browser เช่น Teleport หรืออื่นๆก็ได้) เวปเพจของคุณอาจจะถูกเรียกดูด้วย User Agent ที่คุณไม่เคยได้ยินมาก่อน จะทำยังไง? ถ้าเกิดว่าเป็น spider bot จาก search engine มาเก็บข้อมูลจากเวปเพจของคุณหละ? แน่ใจหรือว่า search engine จะเก็บข้อมูลที่ถูกต้องและดีที่สุดและตรงกับที่คุณต้องการนำเสนอไป? คุณอาจจะพลาดโอกาสที่จะมีคนค้นพบเวปเพจหน้านั้นๆของคุณจาก search engine นั้นๆไปก็ได้? ทางออกที่ดี, ง่าย และสะดวกที่สุดก็คือเขียนเวปเพจให้ได้มาตรฐานที่สามารถดูได้จาก browser ทุกๆโปรแกรม

2.5 สามารถที่จะทราบได้หรือไม่ว่าผู้เยี่ยมชมเข้ามาจากเพจไหนแล้วจะไปที่เพจไหนต่อไป?

ได้.. โดยตรวจสอบจาก HTTP_REFERER ในตัวแปร environment แต่บางครั้งอาจจะไม่ได้กำหนดไว้ส่วนถ้าจะเช็คว่าผู้เยี่ยมชมจะไปที่เพจไหนต่อนั้น ตรวจสอบโดยตรงไม่ได้ ต้องเขียนโปรแกรม CGI เพื่อทำการ redirect ผู้เยี่ยมชมไปยังหน้าที่ผู้เยี่ยมชมต้องการ และบันทึกไว้ว่าผู้เยี่ยมชมต้องการที่จะไปที่ใด โดยให้ทุก link ในเวปเพจของคุณชี้ไปยังโปรแกรม CGI โปรแกรมนั้น

2.6 สามารถ redirect ผู้เยี่ยมชมไปยังหน้าอื่นหรือ URL อื่นได้หรือไม่?
ได้.. วิธีง่ายๆก็คือกำหนด "Location:" ที่ header ของผลลัพธ์ของโปรแกรม CGI

2.8 สามารถเรียกโปรแกรม CGI ให้ทำงาน โดยไม่ต้องส่งผลลัพธ์ไปยัง broswer หรือให้ browser ไปยังหน้าอื่น?

ได้.. แต่ต้องใช้อย่างระมัดระวัง! จะทำอย่างไรให้ผู้เข้าเยี่ยมชมทราบว่าการ "submit" ของเขาสำเร็จหรือไม่? และเขาอาจจะกด "submit" ใหม่อีกเรื่อยๆ! ทางออกที่ถูกต้องคือกำหนด HTTP header ให้ส่งค่า status code 204 ตัวอย่างเช่น

#!/bin/sh
# กระทำงานใดๆที่นี่
echo "HTTP/1.0 204 No Change"
echo
ข้อควรระวัง วิธีนี้ไม่ได้ผลกับ browser ทุกๆ browser ทดสอบให้ดีก่อนจะใช้!

2.9 สามารถที่จะส่งผลลัพธ์ออกไปยัง frame อื่นๆของ Netscape ได้หรือไม่?

ได้ วิธีแรกที่ง่ายๆที่สุดก็คือ ระบุ "target=" ไว้ใน link ที่จะเรียกโปรแกรม CGI ใช้งาน อีกวิธีคือส่ง "Window-target:" มากับ header ของผลลัพธ์ หาอ่านรายละเอียดได้ที่ web site ของ Netscape (ไม่ทราบ URL ที่แน่นอนของข้อมูลนี้)

 

เนื้อหาส่วนถัดไป.. ->