CGI / HTML / Web Server
CGI 介紹
一般使用者透過瀏覽器觀賞網頁時, 瀏覽器會和 Web 主機上的 Http server 建立一個連線,然後 Http server 會到一堆事先做好的 HTML 檔案中,找出使用者要看的網頁,回傳給瀏覽器,讓使用者觀賞。這種方式,由於 HTML 檔案是靜態的,所以使用者看過幾次就沒興趣了。因此就有人想到要透過程式來產生 HTML 內容,這樣就不會一成不變了,這就是 CGI的來由。
在觀賞CGI網頁時, 同樣地瀏覽器會和 Web 主機上的 Http server 建立一個連線, 但是接著 Http server 不是去抓檔案, 而是去啟動一個 CGI 程式, 然後將 CGI 程式所產生的內容當成 HTML 傳回給使用者瀏覽器。
說了半天,CGI是什麼呢?它的全名是 Common Gateway Interface,規定了 Http server 和 CGI程式之間傳遞參數和結果的方法。
CGI 運作架構
呼叫 CGI程式
一個含有 Form 的網頁,在 Form 開始的地方都會有如的標記,當使用者填入資料到這個 Form 並按下確定送出鍵後,資料會被傳到 Http server 端,此時 Http serber 會叫起 Action 所指定的 CGI程式, 然後將使用者輸入的資料傳給這個 CGI程式。
傳資料給 CGI 程式
事實上, 使用者填在 Form 中的資料, 瀏覽器會先將其組合成一個
參數1=參數1內容&參數2=參數2內容&...
的參數串, 再傳給 Http server,接著看 Form標記中, Method 的種類:
Method=GET 時,Http server 會將參數串設成環境變數 QUERY_STRING,CGI 程式只要將這個環境變數抓出來用即可,不過由於是透過環境變數在傳遞這個參數串, 所以會有長度上的限制。
Method=POST 時,Http server 會將參數串透過標準輸入傳給 CGI。
直接呼叫 CGI 程式
除了透過Form方式使用 CGI 程式外, 我們也可以用:
="cgi程式名稱?>參數1=參數1內容&參數2=參數2內容& ...">
這種直接呼叫的方式使用 CGI程式,不一定要透過 Form,不過這種方式是以 GET 的方式傳參數, 也就是說參數串有長度上的限制。
CGI程式的結果
CGI程式在處理完資料後, 再將要傳給使用者看的網頁內容往標準輸出 (就是螢幕啦)送. 這些送往螢幕的資料會被 Http server 所攔截, 並將之這些內容送往使用者的瀏覽器, 接著使用者便看到畫面了。
有一點要注意的是, CGI 程式產生的結果, 除了原本的 HTML 內容外,
要先送出 HTTP Header
Content-type:text/html 和一行空白
以 perl 的 cgi 程式來說, 寫法如下
print "Content-type:text/htmlnn";
接下來再 print 真正的 HTML 內容
如果 CGI 程式的結果是要將使用者畫面轉往另外一個 WebPage,
則只需送出 Http Header
Location: 網址的 URL和一行空白
以 perl 的 cgi 程式來說, 寫法如下
print "Location: 網址的 URLnn";
CGI 程式的路徑
由於 CGI程式是放在 WebServer 上,因此我們也是透過 URL 去指明要呼叫的 CGI 程式,那麼 CGI 程式的 URL名稱與真正在硬碟上的對應關係是如何呢?
URL名稱 | 真正硬碟路徑 | |
系統網頁 | /index.html | /usr/local/apache/htdoc/index.html (這個對應關係通常 http server 軟體會有設定檔讓系統管理者可以自由指定, ex:/usr/local/apache/conf/srm |
User個人網頁 | ~tung/index.html | ~tung/public_html/index.html (這個對應關係通常 http server 軟體會有設定檔讓系統管理者可以自由指定) |
系統CGI 程式 | /cgi-bin/test.pl | /usr/local/apach/cgi-bin/test.pl (這個對應關係通常 http server 軟體會有設定檔讓系統管理者可以自由指定) |
User個人CGI程式 | /cgi-bin/cgiwrap/~tung/test.pl | ~tung/public_html/cgi-bin/test.pl (注意!這裡透過 系統 CGI程式 cgiwrap 來呼叫使用者個人網頁目錄~tung/public_html 的子目錄 cgi-bin 下的 CGI程式 test.pl) |
CGI程式的屬性
由前面的架構圖我們知道 CGI 程式是由 Http server 所呼叫,Http server 會用 nobody 這個 user 的權限去執行 CGI,因此:
1. CGI 程式本身的權限應該設成 r-xr-xr-x, 也就是 555, 設定指令為
chmod 555 你的CGI程式
2.CGI程式所要寫入的目錄或資料檔 owner 應該是 nobody, 設定指令為
chown nobody CGI程式所要寫入的檔案
ps: User 的 CGI 程式實際上是由 cgiwrap (suid root) 這個程式所呼叫, cgiwrap 會以 User 帳號的身份去執行 User 的 CGI 程式, 所以 User CGI 程式所要寫入的目錄或資料檔 owner 保持是 user 自己即可。
共通閘道介面
The Common Gateway Interface
Boa: an Embedded Web Server
Boa Webserver
WEB SERVER 編譯流程說明
Build Boa Web Server on uClinux
留言列表