27.5 啟用 CGI 程序檔

Apache 的通用閘道介面 (CGI) 可讓您使用程式或程序檔 (通常指 CGI 程序檔) 建立動態內容。CGI 程序檔可以用任何程式設計語言來編寫。通常會使用類似 Perl 或 PHP 等程式檔設計語言。

若要啟用 Apache 來傳送 CGI 程序檔建立的內容,就必須啟用 mod_cgi 模組。這時也需要用到 mod_alias 模組。這兩種都是預設啟用的模組。如需啟用模組的詳細資訊,請參閱節 27.4.2, 啟用和停用

警告: CGI 安全性

允許伺服器執行 CGI 程序檔會產生潛在的安全性弱點。請參考節 27.7, 避免安全性問題,以取得其他資訊。

27.5.1 Apache 組態

在 SUSE Linux Enterprise Server 中,CGI 程序檔只能在 /srv/www/cgi-bin/ 目錄中執行。這個位置已設定用來執行 CGI 程序檔。如果您已經建立虛擬主機組態 (請參閱虛擬主機組態) 並想要將程序檔放置到主機特定的目錄,則必須解除鎖定和設定此目錄。

範例 27-5 VirtualHost CGI 組態

ScriptAlias /cgi-bin/ "/srv/www/www.example.com/cgi-bin/"

<Directory "/srv/www/www.example.com/cgi-bin/">
 Options +ExecCGI
 AddHandler cgi-script .cgi .pl
 Order allow,deny
 Allow from all
</Directory>

告知 Apache 依照 CGI 程序檔方式來處理位在這個目錄中的所有檔案。

啟用 CGI 程序檔執行

告知伺服器依照 CGI 程序檔方式來處理包含 .pl 和 .cgi 副檔名的檔案。依據個人需要來加以調整。

OrderAllow 指示詞可控制 Allow 和 Deny 指示詞在評估時的預設存取狀態和順序。在這個範例中,Apache 會先評估 deny 陳述式,接著才評估 allow 陳述式,並啟用可從任何位置存取。

27.5.2 執行程序檔範例

CGI 程式設計不同於「一般」程式設計;因為 CGI 程式和程序檔的最前面必須是 MIME-Type 標頭,例如 Content-type: text/html。這個標頭會傳送到用戶端,使其了解所接收內容的類型。其次,程序檔的輸出必須是用戶端 (通常是指 Web 瀏覽器) 可了解的內容 — 舉例來說,在多數情況下是指 HTML、純文字或影像。

Apache 套件會在 /usr/share/doc/packages/apache2/test-cgi 提供簡單的測試程序檔。這個程序檔會以純文字方式輸出部分環境變數的內容。請將這段程序檔複製到 /srv/www/cgi-bin/ 或是虛擬主機的程序檔目錄 (/srv/www/example.com_cgi-bin/),並將其命名為 test.cgi

可由網頁伺服器存取的檔案,應該屬於 root 使用者所有 (如需更多詳細資訊,請參閱節 27.7, 避免安全性問題)。因為網頁伺服器可由不同使用者身份執行,所以 CGI 程序檔必須具備可供全球執行和可供全球讀取等特性。變更 CGI 目錄和使用 chmod 755 test.cgi 指令,便可套用適當的許可權。

現在,請呼叫 http://localhost/cgi-bin/test.cgihttp://www.example.com/cgi-bin/test.cgi。這時應該會顯示 CGI/1.0 測試程序檔報告

27.5.3 疑難排解

如果這時沒有顯示測試程式的輸出結果,而是出現錯誤訊息,請檢查下列項目:

CGI 疑難排解

  • 您是否有在變更組態之後重新載入伺服器?請使用 rcapache2 probe 進行檢查。

  • 您是否已正確設定自定的 CGI 目錄 (若有的話)?如果您不確定,請在預設的 CGI 目錄 /srv/www/cgi-bin/ 中測試此程序檔,並使用 http://localhost/cgi-bin/test.cgi 進行呼叫。

  • 檔案許可權是否正確?請切換至 CGI 目錄,並執行 ls -l test.cgi。此測試輸出開頭應該是

    -rwxr-xr-x  1 root root
  • 請確定程序檔沒有包含任何程式設計錯誤。如果您沒有變更 test.cgi 應該就不會出淚錯誤,但是如果您是使用自己的程式,請務必確蓋這些程式沒有包含任何程式設計錯誤。