## 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服务器关闭刚才创建的进程。
![](https://img.kancloud.cn/8c/fb/8cfbe3cb861ce01960a8b27e2a112e33_500x375.png)
## 支持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