Common Gateway Interface

Το CGI (Common Gateway Interface - μεταφράζεται ως "κοινή διεπαφή πύλης") είναι μια επέκταση της λειτουργικότητας του εξυπηρετητή ιστοσελίδων (web server) η οποία παρέχει τη δυνατότητα εκτέλεσης προγραμμάτων ή σεναρίων στον εξυπηρετητή αντί της απλής, αυτόματης αποστολής στατικών σελίδων.

Ιστορικό 
Ο αρχικός σχεδιασμός των εξυπηρετητών ιστοσελίδων ήταν η αποστολή, στον φυλλομετρητή ιστοσελίδων, μιας έτοιμης σελίδας που υπήρχε ήδη στο σύστημα. Για παράδειγμα όταν κάποιος ζητήσει το http://example.com/index.html ο εξυπηρετητής που υπάρχει στο example.com αναζητά τη σελίδα index.html στον κεντρικό του κατάλογο και την επιστρέφει όπως είναι. Αυτό δεν επιτρέπει τη μεταφορά στον φυλλομετρητή τίποτε άλλο παρά στατικά δεδομένα.

Το 1993 το Αμερικάνικο «Εθνικό Κέντρο Εφαρμογών για Υπερυπολογιστές» (NCSA) συζήτησε τη δυνατότητα δημιουργίας μιας διεπαφής η οποία θα μπορούσε να εκτελεί προγράμματα στον εξυπηρετητή ώστε να δημιουργούνται δυναμικές σελίδες. Οι συζητήσεις διενεργήθηκαν σε μία λίστα ηλεκτρονικού ταχυδρομείου και κατέληξαν στη δημιουργία του RFC 3875.

Πως λειτουργεί 
Αν ο εξυπηρετητής έχει ενεργή τη δυνατότητα εκτέλεσης σεναρίων CGI τότε οι σελίδες που βρίσκονται στο φάκελο ο οποίος έχει δηλωθεί ως φάκελος για CGI δεν επιστρέφονται αυτούσιες, αλλά λειτουργούν ως μικρά προγράμματα τα οποία «τρέχουν» στον εξυπηρετητή και το περιεχόμενο της εξόδου τους στέλνεται πίσω στον φυλλομετρητή ιστοσελίδων.

Για παράδειγμα το αρχικό php.cgi του Rasmus Lerdorf, πριν στείλει στον φυλλομετρητή ιστοσελίδων το βιογραφικό του σημείωμα, κατέγραφε σε μια λίστα, στον εξυπηρετητή, το ποιος το ζήτησε.

Παράδειγμα

Ο παρακάτω κώδικας CGI σε γλώσσα προγραμματισμού Perl εμφανίζει όλες τις μεταβλητές που έχει ο εξυπηρετητής:
 #!/usr/local/bin/perl
 ##
 ##  printenv—demo CGI πρόγραμμα το οποίο τυπώνει τις μεταβλητές του συστήματος
 ##
 #
 print "Content-type: text/plain\n\n";
 foreach $var (sort(keys(%ENV))) {
   $val = $ENV{$var};
   $val =~ s/\n/\\n/g;
   $val =~ s/"/\\"/g;
   print "${var}=\"${val}\"\n";
 }

 Για παράδειγμα, εάν ο φυλλομετρητής ζητήσει από τον εξυπηρετητή τις μεταβλητές του συστήματος στο http://example.com/cgi-bin/printenv.pl/foo/bar?var1=value1&var2=with%20percent%20encoding, σε ένα 64-bit λειτουργικό Microsoft Windows με εξυπηρετητή να τρέχει κάτω από cygwin επιστρέφονται οι παρακάτω πληροφορίες:  COMSPEC="C:\Windows\system32\cmd.exe"
 DOCUMENT_ROOT="C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs"
 GATEWAY_INTERFACE="CGI/1.1"
 HOME="/home/SYSTEM"
 HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
 HTTP_ACCEPT_CHARSET="ISO-8859-1,utf-8;q=0.7,*;q=0.7"
 HTTP_ACCEPT_ENCODING="gzip, deflate"
 HTTP_ACCEPT_LANGUAGE="en-us,en;q=0.5"
 HTTP_CONNECTION="keep-alive"
 HTTP_HOST="example.com"
 HTTP_USER_AGENT="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0"
 PATH="/home/SYSTEM/bin:/bin:/cygdrive/c/progra~2/php:/cygdrive/c/windows/system32:..."
 PATHEXT=".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC"
 PATH_INFO="/foo/bar"
 PATH_TRANSLATED="C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\foo\bar"
 QUERY_STRING="var1=value1&var2=with%20percent%20encoding"
 REMOTE_ADDR="127.0.0.1"
 REMOTE_PORT="63555"
 REQUEST_METHOD="GET"
 REQUEST_URI="/cgi-bin/printenv.pl/foo/bar?var1=value1&var2=with%20percent%20encoding"
 SCRIPT_FILENAME="C:/Program Files (x86)/Apache Software Foundation/Apache2.2/cgi-bin/printenv.pl"
 SCRIPT_NAME="/cgi-bin/printenv.pl"
 SERVER_ADDR="127.0.0.1"
 SERVER_ADMIN="(server admin's email address)"
 SERVER_NAME="127.0.0.1"
 SERVER_PORT="80"
 SERVER_PROTOCOL="HTTP/1.1"
 SERVER_SIGNATURE=""
 SERVER_SOFTWARE="Apache/2.2.19 (Win32) PHP/5.2.17"
 SYSTEMROOT="C:\Windows"
 TERM="cygwin"
 WINDIR="C:\Windows"

Από τις μεταβλητές περιβάλλοντος, μπορούμε να δούμε ότι ο φυλλομετρητής είναι ο Firefox ο οποίος τρέχει σε λειτουργικό  Windows 7 με επεξεργαστή 64bit. Ο εξυπηρετητής είναι ο Apache και το σύστημα προσομοιώνει το λειτουργικό Unix. Το σενάριο CGI ονομάζεται cgi-bin/printenv.pl.

Παραπομπές

Εξυπηρετητές
Παγκόσμιος ιστός