1. 程式人生 > >伺服器CGI模式的執行機制

伺服器CGI模式的執行機制

CGI概括:

定義

通用閘道器介面(Common Gateway Interface)HTTP伺服器與你的或其它機器上的程式進行交談的一種工具,其程式須執行在網路伺服器上。

功能

絕大多數的CGI程式被用來解釋處理自表單的輸入資訊,並在服務器產生相應的處理,或將相應的資訊反饋給瀏覽器。CGI程式使網頁具有互動功能。

執行環境

CGI程式在UNIX作業系統上CERNNCSA格式的伺服器上執行。在其它作業系統(如:windows NTwindows95等)的伺服器上也廣泛地使用CGI程式,同時它也適用於各種型別機器。

處理步驟

通過Internet把使用者請求送到伺服器。

伺服器接收使用者請求並交給CGI程式處理。⑶CGI程式把處理結果傳送給伺服器。伺服器把結果送回到使用者。

一、基本原理

CGI :通用閘道器介面(Common Gateway Interface)是一個Web伺服器主機提供資訊服務的標準介面。通過CGI介面,WEB伺服器就能夠獲取客戶端提交的資訊,轉交給伺服器端的CGI程式進行處理,最後返回結果給客戶端。

組成CGI通訊系統的是兩部分:一部分是html頁面,另一部分是執行在伺服器上的CGI程式。

它們之間的通訊方式如下圖:

伺服器與客戶端之間的通訊,是客戶端的瀏覽器和伺服器端的http伺服器之間的HTTP通訊,在這裡只需要知道瀏覽器請求執行伺服器上哪個

CGI程式就行了;

伺服器和CGI程式之間的通訊才是我們關注的。一般情況下,伺服器和CGI程式之間是通過標準輸入輸出來進行資料傳遞的,而這個過程需要環境變數的協作方可實現。

1、伺服器將URL指向一個應用程式

2、伺服器為應用程式執行做準備

3、應用程式執行,讀取標準輸入和有關環境變數

4、應用程式進行標準輸出

環境變數在CGI中有著重要的地位,每個CGI程式只能處理一個使用者請求,所以在啟用一個CGI程式程序時建立了屬於該程序的環境變數。

二、環境變數

對於CGI程式來說,它繼承了系統的環境變數,CGI變數在CGI程式啟動時初始化,在結束時銷燬。

當一個CGI程式不是被HTTP伺服器呼叫時,它的環境變數幾乎是系統環境變數的複製。當這個CGI程式被HTTP伺服器呼叫時,它的環境變數就會多了以下關於HTTP伺服器、客戶端。CGI傳輸過程等專案。

與請求相關的環境變數:

REQUEST_METHOD(伺服器與CGI程式之間的資訊傳輸方式)

QUERY_STRING(採用GET時所傳輸的資訊)

CONTNENT_LENGTH(STDIO中的有效資訊長度)

CONTENT_TYPE(指示所傳來的資訊的MIME型別)

CONTENT_FILE(使用windows httpd/wincgi標準時,用來傳送資料的檔名)

....等等

與伺服器有關環境變數:

GATEWAY_INTERFACE(伺服器所實現的CGI版本)

SERVER_NAME(伺服器的IP或名字)

SERVER_PORT(主機的埠號)

SERVER_SOFTWARE(呼叫CGI程式的HTTP伺服器的名稱和版本號)

   與客戶端相關的環境變數:

REMOTE_ADDR(客戶機的主機名)

REMOTE_HOST(客戶機的IP地址)

ACCEPT(列出客戶機支援的編碼方式)

ACCEPT_LANGUAGE(表明客戶機可接受語言的ISO程式碼)

AUTORIZATION(表明被證實了的使用者)

FROM(列出客戶機的email地址)

IF_MODIFIED_SINGCE(當用get方式請求並且只有當文件比指定日期更早時才返回資料)

PRAGMA(設定將來要用到的伺服器代理)

REFFERER(指定連線到當前文件的文件的URL)

USER AGENT(客戶端瀏覽器的資訊)

/**

*其實上面的變數在都可以在http報文的訊息頭裡面找到

**/

CONTENT_TYPE:application/x-www-form-urlencoded,表示資料來自HTML表單,並且經過URL編碼。

ACCEPT:客戶機所支援的MIME型別清單,內容如:’image/gif,image/jpeg’

REQUEST_METHOD:一般包含POSTGET.

環境變數是一個儲存使用者資訊的記憶體區。當客戶端的使用者通過瀏覽器發出CGI請求時,伺服器就尋找本地的相應CGI程式並執行它。在執行CGI程式的同時,伺服器把該使用者的資訊儲存到環境變數裡。接下來,CGI程式的執行流程是這樣的:查詢與該CGI程式程序相應的環境變數:第一步是request_method,如果是POST,就從環境變數的len,然後到該程序相應的標準輸入取出len長的資料。如果是GET,則使用者資料就在環境變數的QUERY_STRING.

三.CGI程式實現步驟:

1.從伺服器上獲取資料:

獲取環境變數的時候,“如果先判斷REQUEST_METHOD”是否存在,程式會更健壯,否則在某些情況下可能會造成程式崩潰。因為假若CGI程式不是由伺服器呼叫的,那麼環境變數集裡就沒有與CGI相關的環境變數(如REQUEST_METHODREMOTE_ADDR等)新增“進來,也就是說getenv(REQUEST_METHOD)”將返回NULL

2.URL編碼:

不管是POST還是GET方式,客戶端瀏覽器傳送給伺服器的資料都不是原始的使用者資料,而是經過URL編碼的。此時,CGI的環境變數Content_type將被設定,如Content_type = application/x-www-form-urlencode就表示伺服器收到的是經過URL編碼的包含有HTML表單變數資料。

編碼的基本規則是:變數之間用“&”分開;

“變數與其對應值用=”連線;“空格用+”代替;

“保留的控制字元則用%”連線對應的16禁止ASCII碼代替;

“某些具有特殊意義的字元也用%”接對應的16進位制ASCII碼代替;空格是非法字元;

任意不可列印的ASCII控制字元均為非法字元。

3.CGI資料輸出:

CGI程式如何將資訊處理結果返回給客戶端?這實際上是CGI格式化輸出。 在CGI程式中的標準輸出stdout是經過重定義了的,它並沒有在伺服器上產生任何的輸出內容,而是被重定向到客戶瀏覽器,這與它是由C,還是PerlPython實現無關。 所以,我們可以用列印來實現客戶端新的HTML頁面的生成。比如,Cprintf是向該程序的標準輸出傳送資料,PerlPythonprint向該程序的標準輸出傳送資料。

(1CGI標題

CGI的格式輸出內容必須組織成標題/內容的形式。CGI標準規定了CGI程式可以使用的三個HTTP標題。標題必須佔據第一行輸出!而且必須隨後帶有一個空行。

標題描述:

Content_type   (內容型別)設定隨後輸出資料所用的MIME型別

Location    (地址)設定輸出為另外一個文件(URLStatus      (狀態)指定HTTP狀態碼MIME

向標準輸出傳送網頁內容時要遵守MIME格式規則:

任意輸出前面必須有一個用於定義MIME型別的輸出內容(Content-type)行,而且隨後還必須跟一個空行。如果遺漏了這一條,服務將會返回一個錯誤資訊。(同樣使用於其他標題)

例如PerlPython

print Content-type:text/html\n\n;   //輸出HTML格式的資料

print <body>welcome<br>

print </body>

C語言:

printf( Content-type:text/html\n\n);

printf(Welcome\n);

MIME型別以型別/子型別(type/subtype)的形式表示。

其中type表示一下幾種典型檔案格式的一種:

TextAudioVideoImageApplicationMutipartMessage

Subtype則用來描述具體所用的資料格式。

Application/msword微軟的Word檔案

Application/octet-stream一種通用的二進位制檔案格式

Application/zipZip壓縮檔案

Application/pdfPdf檔案

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

Location

使用Location標題,一個CGI可以使當前使用者轉而訪問同一伺服器上的另外一個程式,甚至可以訪問另外一個URL,但伺服器對他們的處理方式不一樣。

使用Location的格式為:LocationFilename/URL

例如:print Location:/test.html\n\n;

這與直接連結到test.html的效果是一樣的。

print Location:http://www.chinaunix.com/\n\n

由於該URL並不指向當前伺服器,使用者瀏覽器並不會直接連結到指定的URL,而是給使用者輸出提示資訊。

HTTP狀態碼:

表示了請求的結果狀態,是CGI程式通過伺服器用來通知使用者其請求是否成功執行的資訊碼,本文不做研究。

四、CGI中的訊號量和檔案鎖 

因為CGI程式時公用的,而WEB伺服器都支援多程序執行,因此可能會發生同時有多個使用者訪問同一個CGI程式的情況。比如,有2個使用者幾乎同時訪問同一個CGI程式,伺服器為他們建立了2CGI程式程序,設為程序A和程序B。假如程序A首先打開了某個檔案,然後由於某種原因被掛起(一般是由於作業系統的程序排程);而就在程序A被掛起的這段時間內,程序B完成了對檔案的整個操作流程:開啟,寫入,關閉;程序A再繼續往下執行,但程序A所操作的檔案依舊是原來檔案的就版本,此時程序A的操作結果將覆蓋程序B的操作結果。 

為了防止這種情況發生,需要用到檔案鎖或者訊號量。

鑰匙檔案?假如有多個不同的HTML可以呼叫同一個CGI程式,那麼CGI程式如何區分它們呢?一個是通過隱含的INPUT標籤。不過覺得這個比較麻煩,因為CGI必須經過一系列解碼後才能找到這個隱含INPUT的變數和其值。

五.設定HTTP伺服器以相容CGI

Perl編寫的CGI程式字尾為:.plPython編寫的CGI程式字尾為:.py;而C編寫的CGI程式字尾為:.cgi,如果在win下編譯出來的是.exe,最好將它重新命名為.cgi。這些都是為了HTTP服務能夠識別並呼叫它們。

當使用appche httpd伺服器時,請編輯它的配置檔案httpd.conf如下:修改AddHandler cgi-script一句為AddHandler cgi-script .cgi .py .pl

相關推薦

伺服器CGI模式執行機制

CGI概括: 定義 通用閘道器介面(Common Gateway Interface)是HTTP伺服器與你的或其它機器上的程式進行“交談”的一種工具,其程式須執行在網路伺服器上。 功能 絕大多數的CGI程式被用來解釋處理來自表單的輸入資訊,並在服務器產生相應的

深入理解JVM_java代碼的執行機制01

功能 存在 oot 對象實例 符號 token 類型 格式 找對象 本章學習重點: 1、Jvm: 如何將java代碼編譯為class文件。 如何裝載class文件及如何執行class文件。 jvm如何進行內存分配和回收。 jvm多線程

【JS】JavaScript引擎的內部執行機制

under scrip str tro blog rip 回調函數 ron span  近期在復習JavaScript,看到setTimeout函數時。想起曾經剛學時,在一本書上看過setTimeout()裏的回調函數執行的間隔時間

【java】之java代碼的執行機制

() alt 分享 str clas not roc 成員 輸入 要在JVM中執行java代碼必須要編譯為class文件,JDK是如何將Java代碼編譯為class文件,這種機制通常被稱為Java源碼編譯機制。 1、JVM定義了class文件的格式,但是並沒有定義如何將ja

python裝飾器執行機制

abc print 前沿 spl ini self. color ret instance 前沿: 首先是看到了單例模型,想不明白 outer中的參數 為什麽能像 global的參數 一樣屹立不倒。 #單例模型 def single_model(cls): in

徹底弄懂 JavaScript 執行機制

函數 大名 定時 意思 技術 渲染 文字 根據 java 本文的目的就是要保證你徹底弄懂javascript的執行機制,如果讀完本文還不懂,可以揍我。 不論你是javascript新手還是老鳥,不論是面試求職,還是日常開發工作,我們經常會遇到這樣的情況:給定的幾行

js --- 執行機制

循環 gpo 可執行 pad loop 同步任務 16px 觸發 pos 1. JS為什麽是單線程的?  JS最初被設計用在瀏覽器中,那麽想象一下,如果瀏覽器中的JS是多線程的。 那麽現在有2個進程,process1 process2,由於是多進程的JS,所以他們對同一個

[轉]JS 引擎的執行機制

wan queue 多線程 .html 單擊事件 語句 eve resolve title ------------------------------------------------------ JS 引擎的執行機制 關於JS引擎的執行機制,首先牢記2點:

js為什麽是單線程的?10分鐘了解js引擎的執行機制

容易 等於 bsp -m 深入理解 block 順序 dom 依次 深入理解JS引擎的執行機制 1.JS為什麽是單線程的? 為什麽需要異步? 單線程又是如何實現異步的呢? 2.JS中的event loop(1) 3.JS中的event loop(2) 4.說說s

js執行機制

分發 sleep 代碼執行 過程 rom spa set 是否 引擎 1. 關於javascript js是一門單線程語言,一切js版的‘多線程’都是用單線程模擬起來的。 2. js事件循環 將任務分為2類:同步任務、異步任務 同步任務進入主線程,異步任務

深入理解Dalvik虛擬機- 解釋器的執行機制

util dlink stat counter before expose 加鎖 enter 機制 Dalvik的指令運行是解釋器+JIT的方式,解釋器就

淺析JS異步執行機制

一個隊列 http請求 調度 等待 __name__ 服務端 nco sta req 前言 JS異步執行機制具有非常重要的地位,尤其體現在回調函數和事件等方面。本文將針對JS異步執行機制進行一個簡單的分析。 從一份代碼講起 下面是兩個經典的JS定時執行函數,這兩個函數的區別

javascript的執行機制—Event Loop

如果 異步任務。 兩個 用戶 徹底 再次 IT bsp 執行順序 既然今天要談的是javascript的事件循環機制,要理解事件循環,首先要知道事件循環是什麽。 我們先從一個例子來看一下javascript的執行順序。 <script> setTime

JavaScript執行機制

指定 i++ 立即執行 使用 func bubuko 異步任務。 下一個 href 原文   簡書原文:https://www.jianshu.com/p/0d2d42fbe1dc 大綱   1、場景分析  2、執行機制相關知識點  3、以實例來說明JavaScript的執

如何讓程式在linux伺服器下一直執行(關閉遠端連線後仍然繼續執行

一、為什麼要使程式在後臺執行 最近剛剛入手在做一個遠端通訊的專案,利用套接字實現長連線通訊。那麼問題來了,我的服務端程式怎麼才能一直在伺服器上執行以達到隨時監測使用者請求的目的呢?查了幾篇部落格,解決了,記一下筆記。程式在後臺跑有以下2個好處: 1:我們遠端連線的之一端並不影響伺服器服務

00001java程式的執行機制

計算機高階語言的型別主要有編譯型和解釋型。而java語言是兩種型別的結合。java語言首先利用文字編輯器編寫java源程式,源程式字尾是.java結尾;再利用編譯器(javac)將源程式編譯成位元組碼檔案,字尾是.class結尾;最後利用虛擬機器(直譯器)解釋執行。 新建了一個ja

Java的執行機制——有C++基礎的Java入門(一)

前言:還是那句話,第一、凡是涉及到概念性內容的時候,我都會到官網去確認內容的真實性!第二、我喜歡偏向於原理學習。在 java介紹裡面,我認為知道這是一門完全面向物件的語言就足夠了。我的導師說C++是認為程式設計師是很強大的,開放了所有的功能許可權;Java是認為程式設計師不是那麼全能的

Web框架——XWAF的程式碼結構和執行機制(4)

    XWAF是一套基於Servlet和java反射技術的Web應用程式框架,它利用Servlet執行機制在伺服器上載入和執行,接管客戶端請求,依靠ServletRequest物件獲取使用者請求資訊,使用ServletResponse物件返回處理結果。   

(轉)SSL/TLS協議執行機制的概述

原文:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html 網際網路的通訊安全,建立在SSL/TLS協議之上。 本文簡要介紹SSL/TLS協議的執行機制。文章的重點是設計思想和執行過程,不涉及具體的實現細節。如果想了解這方面的內容,請參閱RF

JavaScript 執行機制:Event Loop

JavaScript 是單執行緒語言。單執行緒就意味著需要排隊,前一個任務完成才能執行下一個任務。所以任務分為兩種,同步任務和非同步任務。 同步任務指的是,在主執行緒上排隊執行的任務,只有前一個任務執行完畢,才能執行下一個任務。 非同步任務指的是不進入主執行緒,而進入“任務