CGI(Common Gateway Interface)協議詳解

CGI(通用網關接口)是一種標準化的協議,定義了?Web服務器?與?外部程序(如腳本或可執行文件)之間的數據交互方式。它允許服務器動態生成網頁內容,而不僅僅是返回靜態文件。


1. CGI 的核心作用

  • 動態內容生成:早期的Web服務器只能返回靜態HTML文件,CGI的出現使得服務器可以運行程序生成動態內容(如用戶登錄、數據庫查詢等)。

  • 跨語言支持:可以用任何編程語言編寫(如Perl、Python、PHP、C、Bash等),只要程序能讀取環境變量和標準輸入(stdin),并輸出到標準輸出(stdout)。

  • 無狀態處理:每次HTTP請求都會啟動一個新的CGI進程,處理完畢后立即退出(現代方案如FastCGI優化了這一點)。


2. CGI 的工作原理

當用戶訪問一個CGI程序時(如?http://example.com/cgi-bin/script.py),流程如下:

  1. 客戶端發送HTTP請求(如GET或POST)到Web服務器(如Apache/Nginx)。

  2. 服務器識別CGI請求(通常放在/cgi-bin/目錄或特定擴展名如.cgi)。

  3. 服務器啟動CGI程序(如Python腳本),并設置環境變量(如QUERY_STRINGREQUEST_METHOD)。

  4. CGI程序執行

    • 讀取環境變量(如$_SERVER?in PHP、os.environ?in Python)。

    • 處理輸入數據(GET參數從環境變量讀取,POST數據從stdin讀取)。

    • 生成動態內容,輸出到stdout(必須包含HTTP頭,如Content-Type: text/html)。

  5. 服務器捕獲輸出,并返回HTTP響應給客戶端。


3. CGI 的關鍵組成部分

(1) 環境變量(由服務器傳遞給CGI程序)

變量名說明
REQUEST_METHODHTTP方法(GET/POST/PUT等)
QUERY_STRINGURL中?后的查詢參數(如name=foo&age=20
CONTENT_TYPEPOST/PUT請求的Body類型(如application/x-www-form-urlencoded
CONTENT_LENGTHPOST數據的字節長度
HTTP_USER_AGENT客戶端瀏覽器信息(如Mozilla/5.0
REMOTE_ADDR客戶端IP地址
SCRIPT_NAMECGI腳本的路徑(如/cgi-bin/hello.py

(2) 輸入數據

  • GET請求:參數通過QUERY_STRING傳遞(如?id=123)。

  • POST請求:數據通過標準輸入(stdin)傳遞,需讀取CONTENT_LENGTH字節。

(3) 輸出規范

CGI程序必須:

  1. 先輸出HTTP頭(如Content-Type: text/html)。

  2. 空一行\n\n),之后才是響應內容(HTML/JSON等)。

示例(Python CGI):

#!/usr/bin/env python
print("Content-Type: text/html\n\n")  # 必須的空行
print("<h1>Hello, CGI!</h1>")

4. CGI 的優缺點

優點

??簡單通用:任何語言都能寫,適合小型動態網頁。
??跨平臺:所有主流Web服務器(Apache/Nginx/IIS)均支持。
??無依賴:不要求特定框架或運行時(如PHP-FPM、uWSGI)。

缺點

??性能差:每次請求都啟動新進程,高并發時資源消耗大。
??無持久化:無法保持數據庫連接等長期狀態。
??安全性風險:需謹慎處理用戶輸入(如Shell注入)。


5. 現代替代方案

由于CGI的性能問題,現在更多使用:

技術說明
FastCGI持久化進程處理多個請求(PHP-FPM基于此)。
SCGI簡化版FastCGI,性能接近但協議更簡單。
WSGIPython的Web服務器網關接口(如Flask/Django使用)。
PHP-FPMPHP的FastCGI進程管理器,替代mod_php
嵌入式如Apache的mod_php、Nginx的uWSGI,直接與服務器集成。

6. 示例:用不同語言實現CGI

(1) Bash CGI

#!/bin/bash
echo "Content-Type: text/plain"
echo ""
echo "Hello from Bash CGI!"

(2) Python CGI

#!/usr/bin/env python
import osprint("Content-Type: text/html\n\n")
print(f"<p>QUERY_STRING: {os.environ.get('QUERY_STRING')}</p>")

(3) PHP CGI

<?php
header("Content-Type: text/html");
echo "<h1>Hello, " . ($_GET['name'] ?? 'Guest') . "!</h1>";
?>

7. 總結

  • CGI是早期動態網頁的核心技術,定義了Web服務器與外部程序的交互標準。

  • 雖然性能較低,但所有Web開發語言都支持CGI模式(包括PHP、Python、Perl等)。

  • 現代Web開發已轉向更高效的方案(如FastCGI、WSGI),但理解CGI仍有助于掌握底層HTTP交互機制。

如果你的目標是高性能Web應用,建議使用PHP-FPMPython WSGI;如果只是簡單腳本,CGI仍然可用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81486.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025.4.29總結

工作&#xff1a;最近手頭活變得多起來了&#xff0c;畢竟要測兩個版本&#xff0c;有時候覺得很奇怪&#xff0c;活少的時候&#xff0c;又想讓別人多分點活&#xff0c;活多的時候&#xff0c;又會有些許不自然。這種反差往往伴隨著項目的節奏&#xff0c;伴隨著兩個極端。所…

【KWDB 創作者計劃】技術解讀:多模架構、高效時序數據處理與分布式實現

技術解讀&#xff1a;多模架構、高效時序數據處理與分布式實現 一、多模架構1.1 架構概述1.2 源碼分析1.3 實現流程 二、高效時序數據處理2.1 處理能力概述2.2 源碼分析2.3 實現流程 三、分布式實現3.1 分布式特性概述3.2 源碼分析3.3 實現流程 四、總結 在當今數據爆炸的時代&…

# 前后端分離象棋對戰項目開發記錄

1. **結構清晰**&#xff1a;使用更直觀的標題、分段和列表&#xff0c;增強可讀性。 2. **視覺美觀**&#xff1a;添加Markdown格式化&#xff08;如代碼塊、加粗、斜體&#xff09;&#xff0c;并建議配色和排版風格。 3. **內容精煉**&#xff1a;精簡冗余表述&#xff0c;突…

HarmonyOS NEXT 詩詞元服務項目開發上架全流程實戰(一、項目介紹及實現效果)

在當今數字化時代&#xff0c;如何讓傳統文化與現代科技相結合&#xff0c;成為了一個值得思考的問題。詩詞作為中國傳統文化的重要組成部分&#xff0c;承載著豐富的歷史信息和文化內涵。為了讓更多人了解和欣賞詩詞的魅力&#xff0c;我們決定開發一款基于HarmonyOS NEXT的詩…

linux jounery 日志相關問題

/var/log 目錄 是 Linux 系統中存放各種日志文件的標準位置。 這些日志文件記錄了系統及其服務的運行狀態。 日志文件來源 系統日志 由 syslog 或 systemd-journald&#xff08;如果使用 systemd 的話&#xff09;等日志服務生成。記錄內核消息和各種系統事件&#xff0c;例如…

JavaWeb學習打卡-Day7-正向代理、反向代理、Nginx

正向代理 概念&#xff1a;正向代理是一個位于客戶端和目標服務器之間的代理服務器&#xff08;中間服務器&#xff09;。為了從目標服務器取得內容&#xff0c;客戶端向代理服務器發送一個請求&#xff0c;并且指定目標服務器&#xff0c;之后代理向目標服務器轉發請求&#…

AI算法可視化:如何用Matplotlib與Seaborn解釋模型?

AI算法可視化&#xff1a;如何用Matplotlib與Seaborn解釋模型&#xff1f; 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 AI算法可視化&#xff1a;如何用Matplotlib與Seaborn解釋模型&#xff1f;摘要引言基礎可…

GoogleTest:TEST_F

GoogleTest:簡單示例及ASSERT/EXPECT說明-CSDN博客 介紹了寫一個簡單的測試用例 如果某些測試用例在開始測試前需要先做一些準備工作,那么如果每次都需要先準備,那么會比較的麻煩,基于這種情況可以使用GoogleTest的TEST_F方法。 簡單點說,就是需要先定義一個繼承于testin…

【云備份】配置文件加載模塊

目錄 一.為什么要配置文件 二.配置文件的實現 三.單例文件配置類設計 四.源碼 一.為什么要配置文件 我們將服務端程序運行中用到的一些關鍵信息保存到配置文件中&#xff0c;這樣可以使程序的運行更加靈活。 這樣做的好處是&#xff0c;未來如果我們想要修改一些關鍵信息&…

文號驗證-同時對兩個輸入框驗證

文號驗證-同時對兩個輸入框驗證 效果&#xff1a; 一、如果有多個文號&#xff1a; <div v-for"(item, index) in approvalForm.productApprovalTypeEvents" :key"index"> <el-form-itemlabel"文號":prop"productApprovalTypeEv…

高翔視覺slam中常見的OpenCV和Eigen的幾種數據類型的內存布局及分配方式詳解

vector<Eigen::Vector2d, Eigen::aligned_allocator<Eigen::Vector2d>> 內存布局及分配方式詳解 1. 內存對齊的必要性 Eigen 的固定大小類型(如 Eigen::Vector2d、Eigen::Matrix4d 等)需要 16 字節內存對齊,以支持 SIMD 指令(如 SSE/AVX)的并行計算。若未對…

5G育種技術之植物性狀訂制

行業展望 我國農作物種業市場規模逐年增長&#xff0c;其中以糧食作物種子市場規模較大。目前我國育種產業發展仍處于初級階段&#xff0c;存在龍頭企業市場占有率和行業集中度不高、企業育種技術和水平落后于發達國家、種企研發投入不足等問題。雖然基因編輯技術的出現有望改…

用戶隱私與社交媒體:評估Facebook的保護成效

在這個數字化時代&#xff0c;社交媒體平臺&#xff0c;尤其是Facebook&#xff0c;已經成為我們生活中不可或缺的一部分。然而&#xff0c;隨著用戶隱私問題日益受到關注&#xff0c;社交媒體平臺如何處理和保護用戶數據成為了公眾討論的焦點。本文將探討Facebook在用戶隱私保…

python實現基于Windows系統計算器程序

Python實現Windows系統計算器程序&#xff08;含高級功能&#xff09; 下面我將介紹如何使用Python創建一個功能完整的Windows風格計算器程序&#xff0c;包含基本運算和高級數學功能。 1. 使用Tkinter實現基礎計算器 import tkinter as tk from tkinter import ttk import …

Vue 3 響應式 API 詳解與實戰案例

Vue 3 引入了全新的響應式系統&#xff0c;主要通過 ref 和 reactive 這兩個 API 來實現。下面我將通過具體代碼示例詳細講解它們的用法和區別。 1. ref - 基礎響應式 API ref 用于創建響應式的基本類型數據&#xff08;如字符串、數字、布爾值&#xff09;&#xff0c;也可以…

軟件第三方測試:關鍵部分、意義、流程及方法全解析?

軟件第三方測試是保障軟件質量的關鍵部分&#xff0c;它由專業的機構來開展&#xff0c;這個機構不隸屬于開發方和使用方&#xff0c;能以客觀公正的視角找出軟件問題。 測試意義 軟件第三方測試意義重大&#xff0c;它依靠專業技術&#xff0c;依照嚴格流程&#xff0c;對軟…

WPF TextBlock控件性能優化指南

WPF TextBlock控件性能優化指南 1. 引言 TextBlock作為WPF中最基礎且使用最廣泛的文本顯示控件&#xff0c;其性能優化對整個應用程序的響應速度和資源占用有著重要影響。盡管TextBlock是一個輕量級控件&#xff0c;但在大型應用或需要顯示大量文本的場景中&#xff0c;不恰當…

【Linux】關于虛擬機

一些在Linux驅動開發中使用虛擬機的經驗。 部分圖片和經驗來源于網絡&#xff0c;若有侵權麻煩聯系我刪除&#xff0c;主要是做筆記的時候忘記寫來源了&#xff0c;做完筆記很久才寫博客。 專欄目錄&#xff1a;記錄自己的嵌入式學習之路-CSDN博客 目錄 1 VirtualBox使用技…

AimRT從入門到精通 - 04RPC客戶端和服務器

一、ROS中的service通信機制 服務通信也是ROS中一種極其常用的通信模式&#xff0c;服務通信是基于請求響應模式的&#xff0c;是一種應答機制。也即&#xff1a;一個節點A向另一個節點B發送請求&#xff0c;B接收處理請求并產生響應結果返回給A。比如如下場景&#xff1a; 機器…

普通IT的股票交易成長史--20250502 突破(1)

聲明&#xff1a;本文章的內容只是自己學習的總結&#xff0c;不構成投資建議。文中觀點基本來自yt站方方土priceaction&#xff0c;綜合自己的觀點得出。感謝他們的無私分享。 送給自己的話&#xff1a; 倉位就是生命&#xff0c;絕對不能滿倉&#xff01;&#xff01;&#…