获取CGI环境变量

时间:2022-12-12 23:48:21

1.CGI环境变量简介

CGI程序继承了系统的环境变量,CGI的环境变量,在CGI程序在启动时初始化,结束时销毁,当一个CGI程序不是被HTTP服务器调用时,其环境变量基本是系统的环境变量。当属于HTTP服务器调用时,他的环境变量就会多了以下关于HTTP服务器、客户端、CGI传输过程等项目。

 

 

CGI相关的环境变量有三种,与请求相关的环境变量、与服务器相关的环境变量,以及与客户端相关的环境变量。

2.下面列举一些环境变量

环境变量 
意义

SERVER_NAME 
CGI脚本运行时的主机名和IP地址.

SERVER_SOFTWARE 
你的服务器的类型如: CERN/3.0 NCSA/1.3.

GATEWAY_INTERFACE 
运行的CGI版本.对于UNIX服务器,这是CGI/1.1.

SERVER_PROTOCOL 
服务器运行的HTTP协议.这里当是HTTP/1.0.

SERVER_PORT 
服务器运行的TCP口,通常Web服务器是80.

REQUEST_METHOD 
POST GET,取决于你的表单是怎样递交的.

HTTP_ACCEPT  
浏览器能直接接收的Content-types, 可以有HTTP Accept header定义.

HTTP_USER_AGENT 
递交表单的浏览器的名称、版本 和其他平台性的附加信息。

HTTP_REFERER 
递交表单的文本的 URL,不是所有的浏览器都发出这个信息,不要依赖它

PATH_INFO 
附加的路径信息, 由浏览器通过GET方法发出.

PATH_TRANSLATED 
PATH_INFO中系统规定的路径信息.

SCRIPT_NAME 
指向这个CGI脚本的路径,是在URL中显示的(, /cgi-bin/thescript).

QUERY_STRING 
脚本参数或者表单输入项(如果是用GET递交). QUERY_STRING包含URL中问号后面的参数.

REMOTE_HOST 
递交脚本的主机名,这个值不能被设置.

REMOTE_ADDR 
递交脚本的主机IP地址.

REMOTE_USER 
递交脚本的用户名. 如果服务器的authentication被激活,这个值可以设置。

REMOTE_IDENT 
如果Web服务器是在ident (一种确认用户连接你的协议)运行,递交表单的系统也在运行ident,这个变量就含有ident返回值.

CONTENT_TYPE 
如果表单是用POST递交,这个值将是 application/x-www-form-urlencoded.在上载文件的表单中, content-type是个 multipart/form-data.

CONTENT_LENGTH 
对于用POST递交的表单,标准输入口的字节数.

 

 

3.获取CGI变量

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

const std::string ENV[]=
{
"SERVER_NAME",
"SERVER_SOFTWARE",
"GATEWAY_INTERFACE",
"SERVER_PROTOCOL",
"SERVER_PORT",
"REQUEST_METHOD",
"HTTP_ACCEPT",
"HTTP_USER_AGENT",
"HTTP_REFERER",
"PATH_INFO",
"PATH_TRANSLATED",
"SCRIPT_NAME",
"QUERY_STRING",
"REMOTE_HOST",
"REMOTE_ADDR",
"REMOTE_USER",
"REMOTE_IDENT",
"CONTENT_TYPE",
"CONTENT_LENGTH"
};

int get_cgi_env()
{
int i = 0;
std::cout<<"Content-type:text/html\r\n\r\n";
std::cout<<"<html>\n";

std::cout<<"<head>\n";
std::cout<<"<title> CGI Envrionment Variables</title>\n";
std::cout<<"</head>\n";

std::cout<<"<body>\n";
//std::cout<<"<h2>Hello World ! This is my first CGI program </h2>\n";

std::cout<<"<table border =\"0\" cellspacing=\"2\">";
for(i=0;i< sizeof(ENV)/sizeof(ENV[0]);i++)
{
std::cout<<"<tr>";
std::cout<<"<td>" <<ENV[i]<<"</td>";
std::cout<<"<td>";
char *value = getenv(ENV[i].c_str());
if(NULL != value)
{
std::cout<< value;
}
else
{
std::cout<<"Environment variable does not exist.";
}
std::cout<<"</td>";
std::cout<<"</tr>\n";
}
std::cout<<"</table>";
std::cout<<"</body>\n";
std::cout<<"</html>\n";
//std::cout<<"</head>\n";



return 0;
}

int main()
{
get_cgi_env();
return 0;
}



g++ 2.cpp -o get_cgi_env -g


拷贝可执行文件到http服务器的cgi-bin目录下

root@ubuntu:/share/http/apache2.2.32-install# cp /share/get_cgi_env cgi-bin/ 


浏览器输入

http://192.168.1.211:8080/cgi-bin/get_cgi_env


浏览器输出

SERVER_NAME 192.168.1.211
SERVER_SOFTWARE Apache/2.2.32 (Unix)
GATEWAY_INTERFACE CGI/1.1
SERVER_PROTOCOL HTTP/1.1
SERVER_PORT 8080
REQUEST_METHOD GET
HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
HTTP_USER_AGENT Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0
HTTP_REFERER Environment variable does not exist.
PATH_INFO Environment variable does not exist.
PATH_TRANSLATED Environment variable does not exist.
SCRIPT_NAME /cgi-bin/get_cgi_env
QUERY_STRING  
REMOTE_HOST Environment variable does not exist.
REMOTE_ADDR 192.168.1.100
REMOTE_USER Environment variable does not exist.
REMOTE_IDENT Environment variable does not exist.
CONTENT_TYPE Environment variable does not exist.
CONTENT_LENGTH Environment variable does not exist.