## CGI 是什么?
CGI(Common Gateway Interface),通用網關接口,是一種用于在Web服務器和應用程序之間傳遞信息的標準協議。
通過CGI,Web服務器可以向應用程序發送數據,應用程序處理數據后返回結果給Web服務器,然后Web服務器將結果返回給客戶端瀏覽器顯示。CGI程序通常使用腳本語言編寫,如Perl、Python、Ruby等。CGI技術已經過時,現在更常用的是FastCGI、PHP-FPM和Web框架等技術。
CGI最早出現于1993年,由美國國家超級計算機應用中心(NCSA)開發。當時Web服務器只能提供簡單的靜態網頁,無法處理動態內容。CGI的出現使Web服務器能夠調用外部程序進行處理,實現動態內容的生成,從而推動了Web應用的發展。CGI協議最初的版本使用了CGI-BIN目錄來保存外部程序,Web服務器會通過調用這個目錄下的程序來實現與外部程序的交互。
隨著Web應用的發展,CGI協議也不斷演化。在1997年,CGI/1.1被發布,增加了對HTTPS協議的支持。隨后,2000年CGI/1.2發布,引入了FastCGI協議,使得Web服務器和外部程序之間的通信變得更加高效。此外,CGI還衍生了各種可擴展性和性能更好的協議,如PHP-FPM、WSGI和ASP.NET等,不斷推動著Web應用的發展。
## CGI的工作流程
在網頁中點擊URL 后,調用CGI的流程是:
1. 用戶向Web服務器發送一個請求,請求一個支持CGI的動態頁面。
2. Web服務器從請求中讀取相關的環境變量和輸入數據,存儲在一個標準的輸入流中。
3. Web服務器創建一個新的進程,并在該進程中執行外部程序。執行的外部程序可以是任何語言編寫的腳本文件,如Perl、Python、PHP、Ruby等。
4. Web服務器將保存在標準輸入流中的用戶請求數據傳遞給外部程序作為參數,供程序進行處理。
5. 外部程序讀取請求數據并進行處理,然后將響應數據寫回到標準輸出流中。
6. Web服務器讀取標準輸出流中的響應數據,并將其發送回客戶端瀏覽器。
7. Web服務器關閉剛才創建的進程。

## 支持CGI的Web 服務器
支持CGI的Web服務器很多,以下是一些常見的Web服務器:
* Apache
* Nginx
* Lighttpd
* IIS
* Caddy
* Tomcat
* Jetty
* Gunicorn
## 基于Apache 的第一個CGI示例
### windows
這里提供一個簡單的Windows Apache CGI示例:
1. 安裝 Apache HTTP Server。可以從 Apache 官網下載安裝包,或者使用一個集成環境如 XAMPP。
2. 在 Apache 的配置文件 httpd.conf 中添加以下內容,開啟 CGI 支持:
```
LoadModule cgi_module modules/mod_cgi.so
AddHandler cgi-script .cgi
ScriptAlias /cgi-bin/ "C:/Apache24/cgi-bin/"
```
其中,`ScriptAlias` 指向 CGI 腳本的存放路徑。
3. 創建一個 CGI 腳本文件,例如:hello.cgi。在 C:/Apache24/cgi-bin/ 目錄下創建此文件,內容如下:
```perl
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body><h1>Hello, CGI!</h1></body></html>";
```
文件名的后綴 `.cgi` 與上面設置的 `AddHandler` 一致。
4. 啟動 Apache HTTP Server,并在瀏覽器中訪問 `http://localhost/cgi-bin/hello.cgi`,將會看到顯示 "Hello, CGI!" 的網頁。
注意:需要安裝 Perl 或其他支持的 CGI 編程語言,并將其加入系統環境變量 Path 中,使 Apache 能夠正確地執行 CGI 腳本。
### Linux
要在Apache上運行CGI腳本,需要進行如下配置:
1. 確認Apache已經啟用了CGI模塊。可以通過執行以下命令來檢查:
```
sudo a2enmod cgi
```
如果顯示 "Module cgi already enabled",則說明已經啟用了CGI模塊。如果提示未找到模塊,則需要執行以下命令來安裝:
```
sudo apt-get install libapache2-mod-cgi
```
2. 創建CGI腳本并將其放置在Apache的可執行目錄中。比如,你可以在 /usr/lib/cgi-bin 目錄下創建一個名為 hello.py 的腳本,內容如下:
```
#!/usr/bin/env python
print("Content-type:text/html\r\n\r\n")
print('<html>')
print('<head>')
print('<title>Hello World - First CGI Program</title>')
print('</head>')
print('<body>')
print('<h2>Hello World! This is my first CGI program</h2>')
print('</body>')
print('</html>')
```
3. 將腳本設置為可執行權限:
```
sudo chmod +x /usr/lib/cgi-bin/hello.py
```
4. 修改Apache的配置文件,添加CGI腳本的處理規則。找到 /etc/apache2/sites-available/000-default.conf 文件,添加以下內容:
```
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
```
這個配置中,ScriptAlias 指定了CGI腳本的目錄,而 <Directory> 標簽中的內容則定義了該目錄的訪問權限和執行選項。
5. 重啟Apache服務:
```
sudo service apache2 restart
```
6. 測試CGI腳本。在瀏覽器中輸入以下地址:
```
http://localhost/cgi-bin/hello.py
```
如果一切正常,你將會看到一個包含 "Hello World!" 字樣的網頁。
注意,這里的腳本是用Python編寫的,所以需要在系統中安裝Python解釋器。如果你想使用其他編程語言編寫CGI腳本,需要根據具體語言的要求進行配置。
- 前言
- 1.入門篇
- Python介紹
- 安裝與使用
- Python開發利器之VS Code
- 模塊安裝
- 命令行
- 一次Python無法安裝模塊的問題探索與解決之旅
- 命令運行
- Conda
- 下載地址
- 2.基礎篇
- 基礎語法
- 輸入與輸出
- with as的用法
- 注釋
- Python命令行參數
- 編碼
- 變量類型
- 列表遍歷
- 運算符
- 表達式語句
- 條件
- 循環
- 日期和時間
- 函數
- 高級語法
- @符號-裝飾器
- 模塊和包
- name
- init.py
- 錯誤和異常
- 面向對象
- 3.專題篇
- 常用功能
- Python 字符串連接
- python web
- Python CGI編程
- Python OAuth2
- 認證 Flask-HTTPAuth
- 常用命令
- 內置函數
- dir()
- print(f)
- 標準模塊
- sys
- pickle-數據序列化
- os
- IO(輸入輸出)
- 鍵盤輸入
- 文件讀寫
- 測試
- Python測試框架之pytest快速入門
- pytest-bdd快速示例和問題解決
- 基于pytest-bdd的項目目錄結構和命名規范
- python BDD 的相關概念
- Behave介紹和快速示例
- Python BDD之Behave測試報告
- Python BDD 框架比較之 pytest-bdd vs behave
- pytest進階
- Flask + pytest測試
- 參考網址
- pytest-bdd進階
- hehave進階
- 測試路徑
- python + selunium
- HTML 根據多層CSS 查找元素
- 等待執行
- 使用text 查找 span
- pytest如何在控制臺輸出
- 4.問題篇
- pip pip3 及區別
- TypeError: can only concatenate str (not "NoneType") to str
- 5.實戰篇
- matplotlib-繪圖包
- 導入類
- 命名規范
- 模塊查找
- 6.進階篇
- Flask
- Flask介紹
- Flask擴展模塊
- Flask-Login
- 問題
- Jinja2
- Flask-RESTful
- Flask-JWT-Extended
- WSGI
- Flask-SQLAlchemy
- 部署
- Flask VS Django
- Flask Web
- Flask + Vue
- Flask實戰
- Flask 標準目錄結構
- Blueprints
- 參考
- FastAPI 測試
- https 證書 Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate