26.5. 開始使用 CGI 程序檔

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

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

[Warning]CGI 安全性

允許伺服器執行 CGI 程序檔會產生潛在的安全漏洞。如需更多資訊,請參閱節 26.7, "避免安全性問題"

26.5.1. Apache 組態

在 SUSE Linux 中,CGI 程序檔只能在 /srv/www/cgi-bin/ 目錄中執行。這個位置已設定用來執行 CGI 程序檔。如果您已經建立虛擬主機組態 (請參閱節 26.2.1.2, "虛擬主機組態"),而且希望將程序檔放到主機特定目錄,您必須先為這個目錄解除鎖定並進行設定。

範例 26.5. VirtualHost CGI 組態

ScriptAlias /cgi-bin/ "/srv/www/example.com_cgi-bin/"1

<Directory "/srv/www/example.com_cgi-bin/">
 Options +ExecCGI2
 AddHandler cgi-script .cgi .pl3
 Order allow,deny4
 Allow from all
</Directory>
    
1

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

2

啟用 CGI 程序檔執行

3

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

4

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

26.5.2. 執行程序檔範例

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

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

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

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

26.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 應該就不會出現錯誤,但是如果您是使用自己的程式,請務必確認這些程式沒有包含任何程式設計錯誤。