CGI動態頁面html
相關模塊 | 相關指令 |
---|---|
CGI(公共網關接口)定義了web服務器與外部內容生成程序之間交互的方法,一般是指CGI程序或者CGI腳本,它是在網站上實現動態頁面的最簡單和經常使用的方法。本文將對如何在Apache web服務器上創建CGI以及如何編寫CGI程序進行介紹。python
配置Apache以容許CGIlinux
要讓CGI程序能正常運做,必須配置Apache以容許CGI的執行,web
第一步:配置Apache(httpd.conf)加載cgi模塊,詳細參考 Apache不從新編譯,利用apxs工具給Apache添加模塊,如cgi模塊shell
第二步:配置Apache(httpd.conf)設置cgi目錄,以下方法之一:apache
方法一:ScriptAlias瀏覽器
ScriptAlias指令使Apache容許執行一個特定目錄中的CGI程序。當客戶端請求此特定目錄中的資源時,Apache假定其中全部的文件都是CGI程序並試圖運行它。安全
ScriptAlias指令形如:bash
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