什么是 CGI
CGI 目前由 NCSA 维护,NCSA 定义 CGI 如下:
CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端 HTML 页面的接口。
网页浏览
为了更好的了解 CGI 是如何工作的,我们可以从在网页上点击一个链接或 URL 的流程:
- 1、使用你的浏览器访问 URL 并连接到 HTTP web 服务器。
- 2、Web 服务器接收到请求信息后会解析 URL,并查找访问的文件在服务器上是否存在,如果存在返回文件的内容,否则返回错误信息。
- 3、浏览器从服务器上接收信息,并显示接收的文件或者错误信息。
CGI 程序可以是 Python 脚本,PERL 脚本,SHELL 脚本,C 或者 C++ 程序等。
CGI 架构图
Web 服务器支持及配置
在你进行 CGI 编程前,确保您的 Web 服务器支持 CGI 及已经配置了 CGI 的处理程序。
Apache 支持 CGI 配置(这里使用PHPstudy集成的Apache):
打开Apache的配置文件httpd-conf
,在文件中找到如下内容:
首先找到ScriptAlias(图片内容为已经修改过的值,默认值应该有所不同而且是被注释掉的)
修改为项目地址 ScriptAlias /cgi-bin/ "F:/phpstudy/phpstudy_pro/WWW/webpy"
(之前的项目都放在F:/phpstudy/phpstudy_pro/WWW/
下,这个文件夹是PHPstudy的apache默认项目文件夹,将路径改为这样可以方便localhost访问)。
然后找到Directory,将其修改为
<Directory "F:/phpstudy/phpstudy_pro/WWW/webpy">
AllowOverride None
Options +ExecCGI
Order allow,deny
Allow from all
</Directory>
注意:这里的路径和上面设置的路径是一样的。
接着找到AddHandler
添加.py
。使apache识别.py文件为cgi程序(图中已添加)。
接下来我们就可以在webpy文件夹下写pythonCGI程序了。
第一个CGI程序
我们使用 Python 创建第一个 CGI 程序,文件名为 hello.py,文件位于 /var/www/cgi-bin目录中,内容如下:
#!/usr/bin/python3
# 请注意第一行代码,在linux中需要在py文件中正确指定python解释器的路径才能运行 # 在Windows中使用Python CGI文件也需要正确指定python解释器的路径才能运行
#coding=utf-8
print("Content-type:text/html") # 指定返回的类型,没有这行代码会报错
print() # 空行,告诉服务器结束头部
# 以下是要返回的HTML正文 print ('<html>')
print ('<head>')
print ('<title>Hello Word - 我的第一个 CGI 程序!</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hello Word! 我的第一CGI程序</h2>')
print ('</body>')
print ('</html>')
文件保存后修改 hello.py,修改文件权限为 755(linux和macos需要在webpy文件夹下使用下面的命令来修改文件读写权限,在Windows环境下需要修改文件的读写权限):
chmod 755 hello.py
以上程序在浏览器访问显示结果如下:
这个的 hello.py 脚本是一个简单的 Python 脚本,脚本第一行的输出内容"Content-type:text/html"发送到浏览器并告知浏览器显示的内容类型为"text/html"。
用 print 输出一个空行用于告诉服务器结束头部信息。
注:如果此处出现乱码,可以在打印html的时候打印,在下文部分代码中有所体现(注意,这里不使用UTF-8的原因是小编在这里使用utf-8出现乱码,这是因为小编的系统是Windows系统,系统默认字符集是GBK,所以会出现乱码)。
另外:请注意第一行代码,在linux中需要在py文件中正确指定python解释器的路径才能运行 。在Windows中使用Python CGI文件也需要正确指定python解释器的路径才能运行
HTTP头部
hello.py 文件内容中的" Content-type:text/html"即为 HTTP 头部的一部分,它会发送给浏览器告诉浏览器文件的内容类型。
HTTP 头部的格式如下:
HTTP 字段名: 字段内容
例如:
Content-type: text/html
以下表格介绍了 CGI 程序中 HTTP 头部经常使用的信息:
头 |
描述 |
Content-type: |
请求的与实体对应的 MIME 信息。例如: Content-type:text/html |
Expires: Date |
响应过期的日期和时间 |
Location: URL |
用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 |
Last-modified: Date |
请求资源的最后修改时间 |
Content-length: N |
请求的内容长度 |
Set-Cookie: String |
设置 Http Cookie |
CGI 环境变量
所有的 CGI 程序都接收以下的环境变量,这些变量在 CGI 程序中发挥了重要的作用:
变量名 |
描述 |
CONTENT_TYPE |
这个环境变量的值指示所传递来的信息的 MIME 类型。目前,环境变量 CONTENT_TYPE 一般都是:application/x-www-form-urlencoded,他表示数据来自于 HTML 表单。 |
CONTENT_LENGTH |
如果服务器与 CGI 程序信息的传递方式是 POST,这个环境变量即使从标准输入 STDIN 中可以读到的有效数据的字节数。这个环境变量在读取所输入的数据时必须使用。 |
HTTP_COOKIE |
客户机内的 COOKIE 内容。 |