cgi 后缀名对应的是通用网关接口程序文件,全称 Common Gateway Interface,它是早期 Web 服务器和外部程序之间进行数据交互的标准接口文件,这类文件一般是可执行脚本或者编译后的程序,常见用 perl c shell python 等语言编写,当浏览器发起请求访问 cgi 后缀文件的时候,Web 服务器会调用这个 cgi 程序运行,把用户提交的表单参数查询字符串传递给程序,程序处理完业务逻辑之后,输出带 HTTP 头部的网页内容,再由服务器返回给浏览器,cgi 是很早的网页动态技术,现在很多新项目已经改用 PHP NodeJS 这类方案,但是老旧网站嵌入式设备路由器管理后台里面,依然还能大量见到 cgi 后缀名文件,很多新手会误以为 cgi 是一种网页格式,其实它本质是可执行程序,不是静态 html 页面。
cgi 后缀名基础特性
文件本质 可执行程序,服务器收到请求之后会启动独立进程运行 cgi 文件
运行方式 每一次请求都会新建独立进程,请求结束进程销毁
传参方式 通过 URL 查询字符串或者 POST 表单把参数传给 cgi 程序
输出要求 必须先输出 HTTP 响应头,再输出页面正文,否则浏览器无法正常解析
常见 Web 服务器 cgi 配置
| 服务器 | cgi 启用要点 |
|---|---|
| Apache | 配置 ScriptAlias,指定 cgi 目录,给文件加上执行权限 |
| Nginx | 默认不原生支持 cgi,一般搭配 fcgi 或者 fastcgi 组件运行 |
| IIS | 在处理程序映射里面添加 cgi 脚本映射 |
cgi 后缀名运行步骤
第一步 确认 Web 服务器已经开启 cgi 支持,检查 cgi 目录是否设置为可执行目录
第二步 编写 cgi 程序,文件保存为 xxx.cgi,脚本第一行添加解释器声明,比如 perl 或者 python 的 shebang
第三步 给 cgi 后缀文件赋予可执行权限,Linux 系统使用 chmod 添加执行权限,Windows 环境需要对应解释器关联
第四步 浏览器访问网址,带上需要的参数,服务器调用 cgi 程序执行,程序读取环境变量获取请求参数
第五步 程序处理业务,输出 HTTP 头和页面内容,服务器把结果回传给浏览器
cgi 技术优缺点
优点 跨语言支持,任何可以读写标准输入输出的语言都能写 cgi,部署简单,适合小型设备后台
缺点 每次请求新建进程,并发高的时候资源消耗大,性能偏弱,安全性需要开发者自己做好参数过滤,容易出现注入漏洞
区分普通 cgi 和 fastcgi
很多人会混淆 cgi 后缀名和 fastcgi,传统 cgi 是每次请求单独开进程,fastcgi 是常驻进程,不需要反复创建销毁,性能更好,fastcgi 不是以 cgi 后缀作为强制标识,二者底层接口思想类似,但是运行模型不一样。
总结,cgi 后缀名就是通用网关接口程序文件,作为 Web 服务器和外部程序交互的桥梁,多用于老旧网站和嵌入式设备后台,核心特点是请求触发独立进程执行,优点简单跨语言,缺点并发性能差,现在新项目很少原生使用传统 cgi。
【常见问题】
问题 1 cgi 后缀名文件可以直接双击打开吗
回答 1 cgi 后缀名文件不建议直接双击打开,它是 Web 服务端可执行程序,需要在 Web 服务器环境运行,双击一般只会用文本编辑器打开源码,不会执行动态交互逻辑。
问题 2 cgi 后缀名为什么访问报错 500
回答 2 cgi 后缀名访问出现 500 错误,大多是文件缺少执行权限,脚本语法错误,解释器路径写错,或者没有正确输出 HTTP 响应头,排查这几项就能解决大部分 cgi 后缀名报错。
问题 3 cgi 后缀名是 html 网页吗
回答 3 cgi 后缀名不是 html 网页,它是服务端可执行程序,运行之后才动态生成 html 内容,静态 html 是固定内容,cgi 后缀名每次运行都可以根据请求参数生成不同页面。
【免责申明】
本文为 cgi 后缀名相关技术科普,不同服务器版本配置存在差异,实际部署请参考对应官方文档,内容仅供学习参考。


