[Apache手冊]Linux環境下配置Apache運行cgi


CGI動態頁面

 CGI(公共網關接口)定義了web服務器與外部內容生成程序之間交互的方法,通常是指CGI程序或者CGI腳本,它是在網站上實現動態頁面的最簡單和常用的方法。本文將對如何在Apache web服務器上建立CGI以及如何編寫CGI程序進行介紹。

配置Apache以允許CGI

要讓CGI程序能正常運作,必須配置Apache以允許CGI的執行,

第一步:配置Apache(httpd.conf)加載cgi模塊,詳細參考 Apache不重新編譯,利用apxs工具給Apache添加模塊,如cgi模塊

第二步:配置Apache(httpd.conf)設置cgi目錄,如下方法之一:

方法一:ScriptAlias

ScriptAlias指令使Apache允許執行一個特定目錄中的CGI程序。當客戶端請求此特定目錄中的資源時,Apache假定其中所有的文件都是CGI程序並試圖運行它。

ScriptAlias指令形如:

ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/

完整配置參考如下:

<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
</IfModule>

<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all  #千萬別忘了這個配置
</Directory>

如果Apache被安裝到默認位置,默認的配置文件httpd.conf中就會有上述配置。ScriptAliasAlias指令非常相似,都是定義了映射到一個特定目錄的URL前綴,兩者一般都用於指定位於DocumentRoot以外的目錄,其不同之處是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返回一個出錯消息。

方法二:ScriptAlias目錄以外的CGI

由於安全原因,CGI程序通常被限制在ScriptAlias指定的目錄中,這樣,管理員就可以嚴格控制誰可以使用CGI程序。但是,如果采取了恰當的安全措施,則沒有理由不允許其他目錄中的CGI程序運行。比如,你可能希望用戶在UserDir指定的宿主目錄中存放頁面,而他們有自己的CGI程序,但無權訪問cgi-bin目錄,這樣,就產生了運行其他目錄中CGI程序的需求。

允許CGI在任意目錄執行需要兩個步驟:

#第一步:指定特定文件后綴為CGI文件(即,告訴服務器哪些文件是CGI文件)。

有2種方法:方法一是定義MIME類型為application/x-httpd-cgi,方法二是使用 AddHandler SetHandler 指令

例如,下面的AddHandler指令告訴服務器所有帶有cgi或pl后綴的文件是CGI程序。(添加到配置文件的最后面即可)

AddType application/x-httpd-cgi .cgi .pl #方法一
AddHandler cgi-script .cgi .pl #方法二

#第二步:設置CGI的目錄屬性,必須在Options指令中啟用ExecCGI選項。

可以在主配置文件中,使用Options指令顯式地允許特定目錄中CGI的執行:

<Directory "/usr/local/apache2/cgi-bin">
	Options ExecCGI
	AllowOverride None
	Order allow,deny
	Allow from all
</Directory>

方法三:.htaccess文件

.htaccess指南示范了怎樣在沒有權限修改httpd.conf文件的情況下激活CGI程序。

#用戶目錄

為了允許用戶目錄中所有以".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> 

#編寫CGI程序 

編寫CGI程序和"常規"程序之間有兩個主要的不同。

首先,在CGI程序的所有輸出前面必須有一個HTTP的MIME類型的頭,對客戶端指明所接收內容的類型,大多數情況下,像這樣:

Content-type: text/html

其次,輸出要求是HTML形式的,或者是瀏覽器可以顯示的其他某種形式。多數情況下,輸出是HTML形式的,但偶然也會輸出一個gif圖片或者其他非HTML的內容。

除了這兩點,編寫CGI程序和編寫其他程序大致相同。

#第一個CGI程序

這個CGI程序的例子在瀏覽器中打印一行文字。把下列存為first.pl文件,並放在你的cgi-bin目錄中。

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

即使不熟悉Perl語言,你也應該能看出它干了什么。第一行,告訴Apache這個文件可以用/usr/bin/perl(或者任何你正在使用的shell)解釋並執行。第二行,打印上述要求的內容類型說明,並帶有兩個換行,在頭后面留出空行,以示HTTP頭的結束。第三行,打印文字"Hello, World."。程序到此結束。

打開你喜歡的瀏覽器並輸入地址:

http://www.example.com/cgi-bin/first.pl

或者是你存放程序的其他位置,就可以在瀏覽器窗口中看到一行:Hello, World. 。雖然並不怎么激動人心,但是一旦這個程序能正常運行,那么就可能運行其他任何程序。

附:

(1)Shell腳本cgi程序

#!/bin/bash
echo "Content-type: text/html"
echo  # 注意,這行不能少
echo "Hello, Shell.cgi"

(2)Python腳本cgi程序

#!/usr/bin/python
print("Content-type: text/html\n") // 末尾的換行符不能少
print("Hello, Python.cgi")

(3)使用任何語言編寫都可以,只要程序可以正常執行,Apache就可以把輸出原封不動的發給瀏覽器。

 

 

更詳細、更深入的教程,請看官方教程:http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/cgi.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM