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中就會有上述配置。ScriptAlias與Alias指令非常相似,都是定義了映射到一個特定目錄的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