Το CGI (Common Gateway Interface - μεταφράζεται ως "κοινή διεπαφή πύλης") είναι μια επέκταση της λειτουργικότητας του εξυπηρετητή ιστοσελίδων (web server) η οποία παρέχει τη δυνατότητα εκτέλεσης προγραμμάτων ή σεναρίων στον εξυπηρετητή αντί της απλής, αυτόματης αποστολής στατικών σελίδων.[1][2]
Ο αρχικός σχεδιασμός των εξυπηρετητών ιστοσελίδων ήταν η αποστολή, στον φυλλομετρητή ιστοσελίδων, μιας έτοιμης σελίδας που υπήρχε ήδη στο σύστημα. Για παράδειγμα όταν κάποιος ζητήσει το 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";
}
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.