Apache CGI動態內容


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。出現在瀏覽器視窗中。