CGI通用网关接口

CGI---公共网关接口 1、什么是CGI CGI:common gateway interface,公共网关接口 作用:,对客户端提交的HTML页面进行数据处理的接口。 CGI的处理流程: (1)web服务器每接收到一个请求,就会fork()一个子进程运行CGI程序 (2)当CGI程序数据处理完之后,web服务器就会杀死该子进程。 2、CGI的缺点 CGI的缺点: (1)频繁地创建和销毁进程 (2)导致web服务器效率低下,无法处理高并发情况 3、fastCGI 为了解决CGI的缺点,提出了很多的改进方法。这里我们介绍fastC 阅读详情

CGI通用网关接口

Common Gatway Interface

原理
简介

CGI 是 Web服务器和程序动态生成数据之间的通用接口

在这里插入图片描述

服务器和CGI程序之间是通过标准输入输出来进行数据传递的,需要环境变量的协作才可以实现

基本流程:

  1. 通过浏览器将用户请求送到服务器
  2. 服务器接收用户请求并交给CGI程序处理
  3. CGI程序把处理结果传送给服务器
  4. 服务器把结果送回到浏览器

对于Windows系统而言,还可以通过profile文件进行数据传输(如ini文件)

每个CGI程序只能处理一个用户请求,在激活一个CGI程序进程时也创建了属于该进程的环境变量。

环境变量

对于CGI程序来说,它继承了系统的环境变量, CGI环境变量在CGI程序启动时初始化,在结束时销毁。

当一个CGI程序不是被HTTP服务器调用时,它的环境变量几乎是系统环境变量的复制。当这个CGI程序被HTTP服务器调用时,它的环境变量就会多了关于HTTP服务器、客户端、CGI传输过程等相关内容。

与请求相关的环境变量

名称说明
REQUEST_METHOD服务器与CGI程序之间的信息传输方式
QUERY_STRING采用GET时所传输的信息
CONTENT_LENGTHSTDIO中有效信息长度
CONTENT_TYPE指示所传来的信息的MIME类型
CONTENT_FILE使用Windows HTTPd/WinCGI标准时,用来传送数据的文件名
PATH_INFO路径信息
PATH_TRANSLATEDCGI程序的完整路径名
SCRIPT_NAME所调用的CGI程序的名字

与服务器相关的环境变量

名称说明
GATEWAY_INTERFACE服务器所实现的CGI版本
SERVER_NAME服务器的IP或名字
SERVER_PORT主机的端口号
SERVER_SOFTWARE调用的CGI程序名称和版本号

与客户端相关的环境变量

名称说明
REMOTE_ADDR客户机的IP地址
REMOTE_HOST客户机的主机名
ACCEPT能接收的应答方式
ACCEPT_ENCODING支持的编码方式
ACCEPT_LANGUAGE可接受的语言
AUTORIZATION认证方式
FORM客户机地址
IF_MODIFIED_SINGCE当用get方式请求并且只有当文档比指定的日期更早时才返回数据
PRAGMA设定将来要用到的服务器代理
REFFERER链接到当前文档的文档的URL
USER_AGENT客户端浏览器的信息
  • CGI传送给Web服务器的信息可以用各种格式,通常是以HTML文本或者XML文本的形式

    1. 传输HTML,文本第一行输出的内容必须是"content-type:text/html\n\n"
    2. 传输XML,文本第一行输出的内容必须是"content-type:text/xml\n\n"
    3. 其他的一些格式:JIF(image/gif)、JPEG(image/jpeg)、AVI(video/avi)
    

两个重要环境变量

  • QUERY_STRING:在浏览器端以GET的方法输入的数据,数据的内容就是url问号后的内容

    char *data = getenv("QUERY_STRING");
    
  • CONTENT_LENGTH:在浏览器端以POST方法输入的数据的字节数,数据的内容通过标准输入获取

    //1. 数据的长度
    char *len = getenv("CONTENT_LENGTH");
    //2、根据长度 从标准输入设备 获取内容
    char data[128]="";
    fgets(data, atoi(len)+1, stdin);
    
POST方法

客户端来的用户数据将存放在CGI进程的标准输入中,同时将用户数据的长度赋予环境变量中的CONTENT_LENGTH

GET方法

客户端来的用户数据存放到到环境变量QUERY_STRING

CGI程序的执行流程:

  • 查询与该CGI程序进程相应的环境变量:

    REQUEST_METHOD,如果是POST,就从环境变量中获取数据的长度len,然后到该进程相应的标准输入取出len长的数据。

    如果是GET,则用户数据就在环境变量的QUERY_STRING中

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int get_inputs(){ 
	int length;
 	char *method;
 	char *inputstring;
	method = getenv("REQUEST_METHOD"); //将返回结果赋予指针
	if(method == NULL)	return 1;       //找不到环境变量REQUEST_METHOD
 	if(!strcmp(method, "POST")) {  // POST方法
 		length = atoi(getenv("CONTENT_LENGTH")); //结果是字符,需要转换
 		if(length != 0)	{
        	inputstring = malloc(sizeof(char)*length + 1) //必须申请缓存,因为stdin是不带缓存的。
        	fread(inputstring, sizeof(char), length, stdin); //从标准输入读取一定数据
 		}
    }else if(!strcmp(method, "GET")){
 		Inputstring = getenv("QUERY_STRING");   
 		length = strlen(inputstring);
    }
}

先判断“REQUEST_METHOD”是否存在,程序会更健壮,否则在某些情况下可能会造成程序崩溃。

假若CGI程序不是由服务器调用的,环境变量集里就没有与CGI相关的环境变量(如REQUEST_METHOD,REMOTE_ADDR等)添加进来

CGI数据输出

在CGI程序中的标准输出stdout是经过重定义了的,没有在服务器上产生任何的输出内容,而是被重定向到客户浏览器

可以用打印来实现客户端新的HTML页面的生成。

CGI标题

CGI的格式输出内容必须组织成标题/内容的形式,CGI标准规定了CGI程序可以使用的三个HTTP标题。

标题必须占据第一行输出,而且必须随后带有一个空行

标题描述
Content-Type设定随后输出数据的MIME类型
Location设定输出为另外一个文档
Status指定HTTP状态码
Content-Type

向标准输出发送网页内容要遵循MIME格式

任意输出前面必须要有一个用于定义MIME类型的输出内容,随后必须跟一个空行。

printf("Content-Type:text/html\n\n");
printf("Welcome\n");

MIME类型以类型/子类型(type/subtype)的形式表示。

  • 其中type表示一下几种典型文件格式的一种:

​ text、audio、video、image、application、mutipart、message

  • Subtype则用来描述具体所用的数据格式。

    类型说明
    Application/mswordword文档
    Application/octet-stream一种通用二进制文件格式
    Application/zipzip压缩文件
    Application/pdfpdf文件
Location

使用location ,一个CGI可以使用当前用户转而访问同一服务器上的另外一个程序,甚至可以访问一个url

使用Location的格式为:Location:Filename/URL

printf("Location:/test.html\n\n");
//这与直接链接到test.html的效果是一样的。
printf("Location:http:*//www.baidu.com/\n\n");
//由于该URL并不指向当前服务器,用户浏览器并不会直接链接到指定的URL,而是给用户输出提示信息。
Demo

GET方式:计算a + b的值

url: http://ip:port/add?a=nn&b=nn

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
    char * method = NULL;
    char *query_string = NULL;
    printf("Content-Type:text/html\r\n\r\n");

    method = getenv("REQUEST_METHOD");
    if(method == NULL){
        printf("<html> <p> UNKNOWN METHOD</p></html>");
        return;
    }
    if(strcasecmp(method,"POST") == 0){
        printf("<html> <p> UNSUPPORTED METHOD</p></html>");
        return 0;
    }
    query_string = getenv("QUERY_STRING");
    if(query_string == NULL){
        printf("<html> <p> PARAMETER ERROR </p></html>");
        return 0;
    } 
    int a = 0;
    int b = 0;
    int i = 0;
    char * start = query_string+2;
    char * end = NULL;
    // format: a=xxx&b=xxx
    for(i = 0;i<strlen(query_string);i++){
        if(*(query_string+i) == '&'){
            end = query_string+i;
            break;
        }
    }
    *end = '\0';
    a = atoi(start);
    start = end +3;
    b = atoi(start);
    printf("<html> <p> %d + %d = %d  </p></html>",a,b,a+b);
    return 0;
}

显示效果如下:

在这里插入图片描述

参考
  1. http://t.csdn.cn/44wV4

  2. http://t.csdn.cn/tkgPJ

  3. http://t.csdn.cn/JqlKj

  4. http://t.csdn.cn/afcOz

3、深入理解通用网关接口(CGI) 本文深入探讨了通用网关接口(CGI)的工作原理,包括其与Web服务器和外部程序的交互流程、常用环境变量的使用方法,以及如何通过CGI处理HTML表单数据。同时,文章还介绍了CGI的安全性考虑、会话管理、动态图像生成和数据持久化等高级主题,帮助开发者构建高效且安全的Web应用程序。 阅读详情

相关推荐

CIGI介绍文件,教程

CIGI介绍文件,教程

CGI接口介绍

1.CGI定义: CGI(CommonGateway Interface)是HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。CGI程序在服务器端执行,并可以和Web服务器在同一主机上。常用的CGI语言有Perl、shell、Python,在windows上也可以用C、C++或Java等进行编写。2.CGI功能: 绝大多数的CGI程序被用来解释处理来自

nmglwy的博客 1497

Common Image Generator Interface (CIGI)-开源

设计用于实现和测试通用图像生成器接口(CIGI)的软件库和工具,通用图像生成器接口(CIGI)是模拟中图像生成器和主机设备之间进行通信的接口。

CGI详解(原理,配置及访问)

进程A再继续往下执行,但进程A所操作的文件依旧是原来文件的就版本,此时进程A的操作结果将覆盖进程B的操作结果。接下来,CGI程序的执行流程是这样的:查询与该CGI程序进程相应的环境变量:第一步是request_method,如果是POST,就从环境变量的len,然后到该进程相应的标准输入取出len长的数据。服务器和客户端之间的通信,是客户端的浏览器和服务器端的http服务器之间的HTTP通信,我们只需要知道浏览器请求执行服务器上哪个CGI程序就可以了,其他不必深究细节,因为这些过程不需要程序员去操作。

redparrot2008的博客 6538

PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试去这一工程的,我去支付宝的蚂蚁金服开放平台里把各个知识点和文档大概都看了一遍,大致弄明白了要怎么操作了,建议大家看看电脑网站开发文档,忙到了夜里十二点左右,成功地用支付宝给的Demo完成了付款操...

爱玲姐姐的博客 1万+

告别抓包:一个Xposed模块教你监控抖音App的本地数据变化

本文详细介绍了如何利用Xposed框架开发模块,实现抖音App本地数据监控的技术方案。通过Hook关键方法,开发者可以实时获取用户信息、推荐算法参数等核心数据,无需Root设备即可高效调试。文章包含完整的环境配置、代码实现和优化技巧,为移动应用开发与测试提供创新解决方案。

weixin_27015733的博客 384

什么是CGI(通用网关接口)?

Web Servers are an important part of the internet and the web. Web servers used to serve web sites, web pages, APIs, documents, video images, etc. Web servers are generally designed to be dynamic to r...

cunjiu9486的博客 1879

深信服上网行为管理设备登录方法、恢复出厂、恢复控制台密码

1.初识设备 1.1 设备外观 1.2 软件版本 2.如何登录设备 首次拿到AC/SG设备时,可以通过以下方法登录设备控制台 SANGFOR AC/SG设备,各网口默认的出厂IP为: eth0(LAN):10.251.251.251/24 , eth1(DMZ)10.252.252.252/24 1、使用一根交叉线连接设备和电脑 (1) 如果电脑连接的是设备的eth0口,需先在电脑上配...

✍千里之行,始于足下 ^,^ 5万+

CGI(通用网关接口)

是一种 Web 服务器与外部应用程序之间通信的标准协议,用于实现动态网页功能。它允许 Web 服务器将用户请求转发给指定的外部程序(如 Python、Perl、PHP 脚本等),由这些程序处理请求并生成动态内容,最终返回给浏览器显示。

2301_78985830的博客 691

python爬取淘宝数据

python爬取淘宝数据淘宝评论 淘宝评论 打开淘宝,选择打开需要爬取的商品的评论。在谷歌浏览器选择开发者工具,选择network,找到list_detail_rate.htm?itemId=624466733121,点击headers、previews,可以看见相应的评论数据。 爬取一页屏评论代码如下 import re import requests headers = { 'Referer': '在headers中', 'User-Agent': '在

qq_36333776的博客 5797

【阿里云大模型高级工程师ACP习题集】2.3 优化提示词改善答疑机器人回答质量

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 1629

解析CGI(通用网关接口)技术

CGI(Common Gateway Interface)是一种在Web服务器与外部应用程序之间进行交互的标准接口。CGI允许Web服务器在客户端请求时,调用外部程序(例如脚本、可执行文件等),并将执行结果返回给客户端浏览器。CGI最初的目的是提供一种在Web服务器和服务器端程序之间进行数据交换的方式,使得网页不仅能显示静态内容,还能根据用户请求动态生成内容。CGI技术虽然在现代Web开发中不再是主流,但它的简单性和跨语言的特性仍然值得我们了解。

zhen_yr19的博客 2527

【实战指南】OpenClaw 使用 Bird Skill 接入 X(Twitter)的终极省心方案:告别每次都要手动喂 Cookie 的痛苦

OpenClaw 使用 Bird Skill 接入 X(Twitter)的终极省心方案:告别每次都要手动喂 Cookie 的痛苦

hampeter的博客 1800

CGI (通用网关接口)

CGI (通用网关接口) CGI cgi即 Common Gateway Interface 译作 通用网关接口 是应用程序与应用程序之间的输入输出协议。比如我们写信,规定了开头一句写称呼,中间写内容,最后署名和日期。看到这种格式,我们就知道这是一封信。我要知道写这封信的人或者日期。那么我就直接信的最后两行。cgi就是应用程序与应用程序之间通信格式规定。 php-cgi cgi可以由任何语言...

Fenglin's Blog 448

社区版 ABAP MCP 能不能读取 SAP S/4HANA 公有云开发对象,我的判断是能试,但不能当成已被 SAP 背书的标准通道

文章摘要:当前存在多个社区项目(如mcp-abap-adt、mcp-abap-abap-adt-api等)通过包装ABAP ADT能力为MCP Server,使AI开发工具能读取ABAP对象。这些项目技术上依赖ADT HTTP API或SAP官方ADT language server,但针对SAP S/4HANA Cloud Public Edition的完整适配仍存在挑战。SAP官方已通过VS Code扩展提供ADT MCP能力,而社区方案在云环境下需遵循ABAP Cloud的严格限制,仅能访问已授权的开

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 86

大疆A型板使用经验分享(四)—— PWM和舵机SG996的控制

一. j

weixin_43361652的博客 3879

【学习笔记】CGI通用网关接口

CGI通用网关接口  Common Gateway Interface(通用网关接口),简称CGI。在物理上是一段程序,运行在服务器上,提供同客户端 HTML页面的接口。 功能   绝大多数的CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器。CGI程序使网页具有交互功能。 处理步骤   ⑴通过Internet把用户请求送到服务器。 ...

weixin_30776863的博客 200

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Web开发中的CGI:通用网关接口详解

摘要:CGI(通用网关接口)是早期解决Web静态内容困境的革命性技术。其核心思想是通过Web服务器与外部程序分工协作,实现动态内容生成:服务器处理网络I/O,CGI程序专注业务逻辑。采用"进程-per-请求"模型,通过环境变量和标准输入获取请求数据,输出标准HTTP响应。虽然因高并发性能瓶颈被FastCGI、内置模块等现代方案取代,但CGI奠定了动态网页开发基础,其设计理念深刻影响了后续Web技术的发展演进,是首个让Web从静态展示转向动态交互的关键技术。(149字)

weixin_42108533的博客 501

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【重要】python之模块CGI 通用网关接口

# -*- coding: utf-8 -*- #python 27 #xiaodeng #CGI模块 import CGI #通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口。 #请注意:CGI不是语言,他只是一种协议。通过CGI接口,web服务器就能够获得客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户...

weixin_34408624的博客 127

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

CGI(通用网关接口)个人简单理解

一、定义 定义:通用网关接口 什么是网关? 网关:又称“协议翻译机” 例如: A协议 > 网关 > B协议 A和B通过网关可以实现“连接”。 二、应用 在PHP、JavaEE/JSP、.NET/ASP、Ruby on rails、Python的Django出现之前,最早c++用CGI做动态的web开发。 类似于现在的JSP. 三、一次网页请求与响应 JSP技...

peanut的博客 1078

图解python CGI(通用网关接口 )

在计算领域,通用网关接口(CGI) 是一种接口规范,它使Web 服务器能够执行外部程序,用于处理用户请求。[1] 此类程序通常是用脚本语言编写的,通常被称为CGI 脚本。 一个典型的用例发生在 Web 用户在使用 CGI 的网页上提交Web 表单时。表单的数据在HTTP 请求中发送到 Web 服务器。然后,Web 服务器在新的计算机进程中(如python解析器)启动 CGI 脚本,将表单数据传递给它。CGI脚本的输出HTML(或json等),返回给Web服务器,服务器会将其返回到浏览器作为它的响应到..

子燕若水的博客 753

CGI(Common Gateway Interface),通用网关接口

通用网关接口,简称CGI,是一种根据请求信息动态产生回应内容的技术。通过CGI,Web 服务器可以将根据请求不同启动不同的外部程序,并将请求内容转发给该程序,在程序执行结束后,将执行结果作为回应返回给客户端。也就是说,对于每个请求,都要产生一个新的进程进行处理。因为每个进程都会占有很多服务器的资源和时间,这就导致服务器无法同时处理很多的并发请求。另外CGI程序都是与操作系统平台相关的,虽...

dengjuanshou7445的博客 390

CGI -- 通用网关接口

定义:  The CGI defines the abstract parameters, known as meta-variables,which describe a client's request. Together with a concrete programmer interface this specifies a platform-independent interface b...

weixin_30908707的博客 90

CGI (Common Gateway Interface) 通用网关接口 介绍

通用网关接口  Common Gate Interface,简称CGI。在物理上是一段程序,运行在服务器上,提供同客户端 Html页面的接口。这样说大概还不好理解。那么我们看一个实际例子: 现在的个人主页上大部分都有一个留言本。留言本的工作是这样的:先由用户在客户端输入一些信息,如名字之类的东西。接着用户按一下“留言”(到目前为止工作都在客户端),浏览器把这些信息传送到服务器的CGI目录下特定的c...

Ubuntu 14.04配置nfs服务 517

caddy-cgi:为 Caddy 提供通用网关接口支持

caddy-cgi:为 Caddy 提供通用网关接口支持 在现代网站开发中,动态内容生成是一个常见需求。Caddy,作为一个现代化、功能齐全、易于使用的Web服务器,本身并不直接支持动态内容生成。然而,通过caddy-cgi插件,我们可以轻松为Caddy添加通用网关接口(CGI)支持,进而实现动态内容的生成。 项目介绍 caddy-cgi 是一个开源项目,旨在为 Caddy 服务器提供 CGI 支...

gitblog_00660的博客 1066
上一篇: 原始套接字-SOCK_RAW
下一篇: C++ STL
暴风雨中的白杨
博客等级 码龄6年 1070粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴风雨中的白杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值