獲取CGI環境變量

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.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章