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. |