ข้อกำหนดของ CGI
ต่อไปนี้คือข้อกำหนดสำหรับ CGI รุ่น 1.1 หรือ CGI/1.1 ส่วนรุ่นต่อๆไปที่พัฒนาขึ้นก็จะเข้ากันได้ (compatible) กับรุ่นนี้

Server และโปรแกรม CGI script ทั้งหลายมีวิธีติดต่อกัน 4 วิธีหลัก ดังต่อไปนี้

CGI Environment Variables

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

ข้อกำหนดของตัวแปรแต่ละตัว


ตัวแปร environment ต่อไปนี้จะกำหนดสำหรับการร้องขอทุกๆครั้ง
  • SERVER_SOFTWARE
    ชื่อและรุ่นของโปรแกรม web server ที่ server ใช้(และใช้เรียกใช้งานโปรแกรม gateway) รูปแบบ: name/version
  • SERVER_NAME
    ชื่อเครื่องของเครื่อง server (hostname), domain name หรือ IP address ที่จะใช้ในการอ้างอิงถึง URL ตัวเอง
  •  
  • GATEWAY_INTERFACE
    รุ่นชื่อ CGI ที่ server ใช้ รูปแบบ : CGI/revision

ตัวแปร environment จะถูกกำหนดขึ้นเฉพาะสำหรับแต่ละโปรแกรม gateway ที่เรียกใช้งาน
  • SERVER_PROTOCOL
    ชื่อและรุ่นของโปรโตคอลที่การร้องขอใช้งาน รูปแบบ : protocol/revision
  • SERVER_PORT
    หมายเลข port ที่การร้องขอถูกส่งเข้ามา
  • REQUEST_METHOD
    วิธีการ(method)ที่การร้องขอบริการที่ใช้ ตัวอย่างสำหรับ HTTP เช่น "GET","HEAD",POST",ฯลฯ
  • PATH_INFO
    ข้อมูลเพิ่มเติมของ path ที่ได้มาจาก client หากข้อมูลนี้ส่งมากับ URL ก่อนที่จะส่งต่อไปให้โปรแกรม CGI จะต้องถอดรหัสโดยserver ก่อน
  • PATH_TRANSLATED
    ข้อมูลที่ server แปลจาก PATH_INFO
  • SCRIPT_NAME
    virtual path ของโปรแกรม gateway ที่จะถูกเรียกใช้งาน ใช้สำหรับเป็น URL อ้างอิงของตัวมันเอง
  • QUERY_STRING
    ข้อมูลที่อยู่ต่อจากเครื่องหมาย ? ของ URL ซึ่งใช้อ้างอิงกับโปรแกรม gateway
  • REMOTE_HOST
    ชื่อเครื่อง (host name) ที่ร้องขอบริการ ถ้าหากว่า server ไม่มีข้อมูลนี้อยู่ ก็จะกำหนด REMOTE_ADDR และไม่กำหนดค่าตัวแปรนี้
  • REMOTE_ADDR
    IP address ของเครื่องที่ร้องขอบริการ
  • AUTH_TYPE
    ถ้าหาก server สนับสนุนการตรวจสอบผู้ใช้และโปรแกรม gateway ถูกป้องกันไว้สำหรับผู้ใช้ที่ได้รับอนุญาต ตัวแปรนี้จะกำหนดโปรโตคอลที่ใช้ในการตรวจสอบผู้ใช้
  • REMOTE_USER
    ถ้าหาก server สนับสนุนการตรวจสอบผู้ใช้และโปรแกรม gateway ถูกป้องกันไว้สำหรับผู้ใช้ที่ได้รับอนุญาต ตัวแปรนี้จะเป็นตัวแปรที่เก็บข้อมูลชื่อผู้ใช้ (username)
  • REMOTE_IDENT
    ถ้าหาก HTTP server สนับสนุน RFC 931identification ตัวแปรนี้จะถูกกำหนด การใช้งานของตัวแปรนี้จำกัดไว้เฉพาะการเก็บบันทึกการทำงานเท่านั้น
  • CONTENT_TYPE
    สำหรับ queries ที่มีข้อมูล attach มาด้วย เช่น HTTP POST และ PUT ตัวแปรนี้จะกำหนดเป็นชนิดของข้อมูลที่ attach มาด้วย
  • CONTENT_LENGTH
    ความยาวของข้อมูลที่ส่งมาจาก client

ตัวแปรเพิ่มเติมอื่นๆ, header line ที่รับมาจาก client จะถูกเก็บไว้ใน environment โดยมี HTTP_ นำข้างหน้าชื่อ ตัวอักษณ - (ขีดกลาง) ที่อยู่ใน header name จะถูกเปลี่ยนเป็น _ (ขีดล่าง) server จะไม่นำ header ที่ถูกกำหนดไว้แล้วมาเก็บซ้ำอีก เช่น Authorization, Content-type และ Content-type ถ้าหากจำเป็น server จะเลือกที่จะคัด header เหล่านี้บางตัวหรือทั้งหมดออกถ้าหากว่านำไปเก็บแล้วเกินขีดจำกัดของ environment ของระบบ

ตัวอย่างเช่น HTTP_ACCEPT ที่ถูกกำหนดใน CGI/1.0 อีกตัวอย่างก็เช่น header User-Agent

  • HTTP_ACCEPT
    ชนิด MIME ซึ่ง client ยอมรับได้ ถูกกำหนดโดย HTTP header แต่ละตัวเลือกในรายการของข้อมูลในตัวแปรนี้จะถูกคั่นออกจากกันด้วยเครื่องหมาย , (ลูกน้ำ) รูปแบบ : type/subtype,type/subtype
  • HTTP_USER_AGENT
    browser ที่ client ใช้ รูปแบบ : software/version library/version

CGI Command line options

ข้อกำหนด

command line ใช้กับกรณีที่ใช้ query ด้วย ISINDEX เท่านั้น จะไม่ใช้ในกรณีของ HTML form หรือ query ชนิดอื่นๆที่ไม่ได้กำหนดขึ้น server จะค้นข้อมูล query (ตัวแปร environment ที่ชื่อ QUERY_STRING ) เพื่อใช้งาน โดยจะค้นหาตัวอักษร = ที่ไม่มีการเข้ารหัส หากไม่พบก็จะใช้เป็น command line หากพบก็จะไม่ใช้เป็น command line โดยที่ client จะเข้ารหัสเครื่องหมาย = ที่ใช้ใน ISINDEX การใช้งานลักษณะนี้มีข้อดีก็คือประหยัดเวลาที่ใช้ในการออกแบบโปรแกรม gateway

ตัวอย่าง ให้ใช้ finger script เพื่อทดสอบ โดยระบุให้ค้นหา "test" จะเห็นว่า script จะเรียกตัวมันเองด้วย /cgi-bin/finger?test และจะกระทำคำสั่ง "finger test" ใน command line และส่งผลลัพธ์ออกมา(กรณีที่ไม่มีผลลัพธ์ เพราะไม่มีผู้ใช้ชื่อ "test")

ถ้า server พบ "=" ใน QUERY_STRING command line จะไม่ถูกนำมาใช้ และไม่มีการถอดรหัสเกิดขึ้น query จะยังคงอยู่เพื่อรอถอดรหัสโดยการเรียกใช้จาก FORM ตัวอย่าง คลิกที่นี่ เพื่อส่ง "test=name" ไปยังโปรแกรม finger เมื่อพบว่า QUERY_STRING มีเครื่องหมาย "=" ที่ไม่ได้ถูกเข้ารหัสไว้อยู่ด้วย จะไม่มีการถอดรหัสใดๆ ตัวโปรแกรมจะส่งผลลัพธ์ออกมาเป็นแบบฟอร์มให้กรอกข้อมูล finger

*** Microsoft IE ตั้งแต่รุ่น 4.0 ขึ้นไปไม่สนับสนุน <ISINDEX>

CGI Script input

ข้อกำหนด

สำหรับการร้องขอบริการที่มีข้อมูล attach ต่อจาก header มาด้วย เช่น HTTP POST or PUT ข้อมูลจะถูกส่งไปยังโปรแกรม gateway โดยผ่าน stdin (standard input)server จะส่งตัวแปร CONTENT_LENGTH ซึ่งจะบอกถึงความยาวของข้อมูล และจะมีตัวแปร CONTENT_TYPE ซึ่งจะระบุชนิดของข้อมูลด้วย

ตัวอย่าง

จะใช้ form ที่มี METHOD="POST" เป็นตัวอย่าง ผลลัพธ์ของ form เป็นข้อมูลเข้ารหัส 7 byte อยู่ในรูป a=b&b=c ในกรณีนี้ server จะกำหนด CONTENT_LENGTH เป็น 7 และ CONTENT_TYPE เป็น application/x-www-form-urlencodeed

CGI Script Output

Script output
โปรแกรม gateway จะส่งผลลัพธ์ของการทำงานออกมาทาง stdout (standard output) ผลลัพธ์นี้จะเป็นได้ทั้งเอกสาร(html หรือ อื่นๆ) หรือ ชุดคำสั่งที่จะสั่งให้ server นำข้อมูลที่ต้องการออกมาแแสดงผล

การตั้งชื่อของโปรแกรม gateway
ปกติโปรแกรม gateway จะส่งผลลัพธ์ซึ่งประมวลผลเสร็จแล้วและส่งกลับไปยัง browser จะมีข้อดีคือไม่จำเป็นต้องส่ง HTTP/1.0 header ทั้งหมดสำหรับทุกๆการร้องขอ

โปรแกรม gateway บางโปรแกรมต้องการที่จะจัดการกับ header เหล่านี้เองและติดต่อกับ browser โดยตรง เพื่อแยกโปรแกรมนี้ออกจากโปรแกรมอื่นๆ ต้องกำหนดให้ CGI รู้ โดยกำหนดชื่อโปรแกรม gateway ให้นำหน้าด้วย nph- ถ้าหากโปรแกรม gateway ไม่ต้องการให้ server เข้ามาจัดการ header ของตัวเอง เช่นกรณีที่โปรแกรมต้องการส่ง HTTP/1.0 ที่ถูกต้อง(หรือ HTTP 0.9) ไปยัง browser

Parsed header
ผลลัพธ์ของโปรแกรม gateway จะเริ่มต้นด้วย header เล็กๆ header นี้จะประกอบด้วยข้อความที่อยู่ในรูปของ HTTP header จบท้ายด้วยบรรทัดว่า 1 บรรทัด (บรรทัดว่างที่มีเฉพาะ LF หรือ CR/LF เท่านั้น)

header ใดๆก็ตามที่ไม่เป็น server directive จะถูกส่งตรงไปยัง browser, server directives 3 อย่างที่ถูกกำหนดไว้มีดังนี้

Content-type
เป็นตัวบอกชนิด MIME ของเอกสารที่จะส่งกลับไปยัง browser

Location
ใช้กำหนดว่าจะอ้างอิงถึงเอกสารอื่นๆที่นอกเหนือจากเอกสารนั้น

หากกำหนด argument ให้เป็น URL server จะจัดการ redirect browser ไปยังเอกสารที่ URL นั้นระบุ

หากกำหนด argument เป็น path server จะจัดการดึงเอกสารที่ถูกระบุส่งกลับไปให้ browser

Status
เป็นตัวบอก server ถึง HTTP/1.0 status line ที่จะส่งกลับไปยัง browser รูปแบบจะอยู่ในรูป nnn xxxxx โดยที่ nnn เป็นรหัสตัวเลข 3 หลัก (เช่น 401) และ xxxxx เป็นข้อความบอกเหตุ (เช่น "Forbidden")

ตัวอย่าง
มีโปรแกรม gateway โปรแกรมหนึ่งที่ใช้จัดการกับข้อมูลที่กรอกมาใน form เมื่อประมวลผลข้อมูลเสร็จแล้วจะส่งผลลัพธ์ออกไปยัง stdout (บรรทัดที่เริ่มด้วย --- มีไว้เพื่อแสดงให้เห็นถึงจุดเริ่มและจบเท่านั้น ไม่ใช่ผลลัพธ์ที่ส่งออกมาจริงๆ)

--- start of output ---
Content-type: text/html

--- end of output ---

( หมายเหตุ : มีบรรทัดว่างหลัง Content-type)

ลองดูใหม่ คราวนี้จะเป็นโปรแกรม gateway ที่ระบุว่าต้องการจะส่งเอกสาร /path/doc.txt จาก server ให้เหมือนกับว่า user ได้ร้องขอเอกสารที่ http://server:port/path/doc.txt ในกรณีนี้โปรแกรม gateway จะส่งผลลัพธ์เป็น

--- start of output ---
Location: /path/doc.txt

--- end of output ---

server จะทำตามข้อเรียกร้องและส่ง /path/doc.txt ไปให้ browser

ถ้าหากว่าโปรแกรม gateway ต้องการที่จะอ้างอิงไปถึงข้อมูลใน gopher server ในกรณีนี้โปรแกรม gateway ต้องกำหนด output เป็น

--- start of output ---
Location: gopher://gopher.ncsa.uiuc.edu/

--- end of output ---

สุดท้าย มีโปรแกรม gateway โปรแกรมหนึ่งต้องการที่จะติดต่อกับ browser โดยตรง ในกรณีนี้ ถ้าโปรแกรมอ้างอิงถึง SERVER_PROTOCOL ด้วย HTTP/1.0 โปรแกรมจะต้องส่งผลลัพธ์ออกมาเป็น HTTP/1.0

--- start of output ---
HTTP/1.0 200 OK
Servere: NCSA/1.0a6
Content-type: text/plain

นี่คือเอกสารข้อความที่โปรแกรม gateway สร้างขึ้นมาให้คุณ

--- end of output ---

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