CGI(公共網關介面)定義了Web伺服器與外部內容生成程式交互的方式,這些程式通常被稱為CGI程式或CGI腳本。這是一種使用您最熟悉的編程語言將動態內容放在網站上的簡單方法。本文檔將介紹如何在Apache Web伺服器上設置CGI,以及如何編寫簡單的CGI程式。
1. 配置Apache以允許CGI
為了使CGI程式正常工作,需要配置Apache以允許CGI執行。有幾種方法可以做到這一點。
方式1:ScriptAlias指令
ScriptAlias指令告訴Apache,為CGI程式留出了一個特定的目錄。Apache將假定此目錄中的每個檔都是CGI程式,並在客戶端請求該特定資源時嘗試執行該程式。
ScriptAlias
指令如下所示:
ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
如果在默認位置安裝了Apache,則顯示的示例可在默認httpd.conf
配置檔找到。ScriptAlias指令很像Alias指令,它定義了一個映射到特定目錄的URL首碼。Alias和ScriptAlias通常用於DocumentRoot目錄之外的目錄。Alias和ScriptAlias之間的區別在於ScriptAlias具有額外的含義,即該URL首碼下的所有內容都將被視為CGI程式。因此,上面的示例告訴Apache,對於以/cgi-bin/
開頭的資源的任何請求都應該在目錄/usr/local/apache2/cgi-bin/
中提供,並且應該被視為CGI程式。
例如,如果請求URL http://www.example.com/cgi-bin/test.pl
,Apache將嘗試執行檔/usr/local/apache2/cgi-bin/test.pl
並返回輸出。當然,該檔必須存在,並且是可執行的,並以特定方式返回輸出,否則Apache將返回錯誤消息。
方式2:ScriptAlias目錄之外的CGI
出於安全原因,CGI程式通常僅限於ScriptAlias的目錄。通過這種方式,管理員可以嚴格控制允許誰使用CGI程式。但是,如果採取適當的安全預防措施,則沒有理由不能從任意目錄運行CGI程式。例如,您可能希望使用UserDir
指令讓用戶在其主目錄中擁有Web內容。如果他們想擁有自己的CGI程式,但無法訪問主cgi-bin
目錄,則需要能夠在其他地方運行CGI程式。
允許在任意目錄中執行CGI有兩個步驟。首先,必須使用AddHandler或SetHandler指令啟動cgi-script
處理程式。其次,必須在Options
指令中指定ExecCGI
。
方式3:使用Options來允許CGI執行
可以在主伺服器配置檔中明確使用Options
指令來指定在特定目錄中允許CGI執行:
<Directory "/usr/local/apache2/htdocs/somedir">
Options +ExecCGI
</Directory>
上述指令告訴Apache允許執行CGI檔。還需要告訴伺服器哪些檔是CGI檔。以下AddHandler
指令告訴伺服器將所有帶有cgi或pl擴展名的檔視為CGI程式:
AddHandler cgi-script .cgi .pl
方式4:用戶目錄
要允許在用戶目錄中以.cgi
結尾的任何檔執行CGI程式,可以使用以下配置。
<Directory "/home/*/public_html">
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
如果您希望指定用戶目錄的cgi-bin
子目錄,其中所有內容都將被視為CGI程式,則可以使用以下命令。
<Directory "/home/*/public_html/cgi-bin">
Options ExecCGI
SetHandler cgi-script
</Directory>
2. 編寫CGI程式
“常規”編程和CGI編程有兩個主要區別。
首先,CGI程式的所有輸出必須以MIME
類型標頭開頭。這是HTTP標頭,告訴客戶端它接收的內容類型。在大多數情況下是這樣的:
Content-type: text/html
其次,輸出需要使用HTML或流覽器能夠顯示的其他格式。大多數情況下將是HTML,但有時您可能會編寫一個CGI程式來輸出gif
圖像或其他非HTML內容。
除了這兩件事,編寫CGI程式看起來很像你可能編寫的任何其他程式。
第一個CGI程式
以下是一個示例CGI程式,它將一行內容輸出到流覽器。輸入以下內容,將其保存到名為first.pl
的檔中,並將其放在cgi-bin
目錄中。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";
即使您不熟悉Perl,也應該能夠知道程式的含義。第一行告訴Apache(或者您正在運行的任何shell),可以通過將檔提供給位於/usr/bin/perl
位置的解釋器來執行此程式。第二行是列印內容類型聲明,然後是兩個回車換行換行符。這會在標題後面添加一個空行,以指示HTTP標題的結尾和正文的開頭。第三行列印字串“Hello,World”。
如果打開流覽器並輸入URL地址 -
http://www.example.com/cgi-bin/first.pl
或者無論你把檔放在哪里,都會看到一行Hello,World
。出現在流覽器窗口中。