测试中偶尔会有这样的需求:
1.需要访问外网的cgi或链接地址,但访问不通
2.需要构造cgi特定的返回,但正常情况下难以构造
为了获得想要的结果,此时可以模拟http请求的返回满足测试需要
方法一:直接获取结果文件
在apache配置的对应路径下新建一个文件,如
DocumentRoot /data/server/xxxx/htdocs
然后用IP/文件名来访问,或者放在alias指定的文件夹下面
新建一个文件名字,比如result,键入以下内容:
result=0&res_info=OK
在浏览器里直接输入http://xxx.xxx.xxx.xxx/result,访问该文件,可以看到返回结果
这个只是相当于把文件内容给取出来了,如果真正模拟cgi的返回的话我一般用shell写个桩cgi
方法二:写一个桩cgi
什么是cgi,见apache指南:cgi
http://man.chinaunix.net/newsoft/ApacheManual/howto/cgi.html
简言之,要自己写一个cgi需要如下条件:
1.apache配置支持cgi
一般机器上有部署过cgi,在该目录下编写一个自己写的cgi是不会有什么不支持的问题,如果是在其他目录新部署自己的cgi,也许会遇到apache的支持问题
如,直接在刚才的目录下面新建一个shell脚本,如test.sh
#!/bin/sh print "result=0&res_info=OK"
再在浏览器里运行,运行的结果就是把这个脚本文件下载下来,而不是执行输出
必须配置Apache以允许CGI的执行,其方法有多种:
(1)ScriptAlias
ScriptAlias指令使Apache允许执行一个特定目录中的CGI程序。当客户端请求此特定目录中的资源时,Apache假定其中文件都是CGI程序并试图运行。
ScriptAlias指令形如:
ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/
如果Apache被安装到默认的位置,默认的配置文件httpd.conf中则会有上述配置。ScriptAlias指令定义了映射到一个特定目录的URL前缀,与Alias指令非常相似,两者一般都用于指定位于DocumentRoot目录以外的目录,其区别是ScriptAlias又多了一层含义,即其URL前缀中任何文件都被视为CGI程序。所以,上述例子会指示Apache,/cgi-bin/应该指向/usr/local/apache/cgi-bin/目录,且视之为CGI程序。
(2)用Options显式地允许CGI的执行
可以在主服务器配置文件中,使用Options指令显式地允许特定目录中CGI的执行:
<Directory /usr/local/apache/htdocs/somedir>Options +ExecCGI</Directory>
上述指令使Apache允许CGI文件的执行。另外,还必须告诉服务器哪些文件是CGI文件。下面的AddHandler指令告诉服务器所有带有cgi或pl后缀的文件是CGI程序:
AddHandler cgi-script cgi pl
(3).htaccess文件
在主服务器配置中如此配置:
AllowOverride Options
在.htaccess文件中,需要如此配置:
Options +ExecCGI
以使Apache允许此目录中CGI程序的执行。
2.按照cgi的格式输出内容
在CGI程序的所有输出前面必须有一个MIME类型的头,即HTTP头
有三个类型的头部: Content-type, Location, 和Status. Content-type 最普遍的。
有关content-type解释可以见有关HTML的说明, 一个你可以发出的特定编码象这样:Content-type: text/html在这个例子中,输出数据的类型是text/html; 换句话说, 他是个HTML文件. 其他详尽的说明参照apache文档
基本使用方法是
echo "xxxxxxx" echo ""
其他详尽的说明参照apache文档
看完了1和2后可以做一个简单的demo:
apache配置为:
ScriptAlias /cgi-bin/ /data/server/xxxxxx/htdocs/cgi-bin/
在目录下新建文件test.sh(写成test.cgi可能会逼格高一点,实际是一样的)
#!/bin/sh echo "Content-type:text/html;charset=UTF8\n" echo "" echo "result=0&res_info=OK"
执行后应该能够返回
result=0&res_info=OK
再让我们干点cgi应该干的事情,解析输入,进行处理,再输出
这里要能够获取请求串中的参数就需要从环境变量env中取出REQUEST_METHOD