測試中偶爾會有這樣的需求:
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和QUERY_STRING
REQUEST_METHOD為提交方式 get或post
QUERY_STRING為請求參數串,可能需要自己分割處理下
比如我需要調一個cgi查詢手機號的驗證碼,傳入的是手機號,處理邏輯是sql查詢,返回的是查詢結果
#!/bin/sh echo "Content-type:text/html;charset=UTF8\n" echo "" method="$REQUEST_METHOD" mobile=`echo $QUERY_STRING | cut -d "=" -f2` y=${mobile:0-3:1} xx=${mobile:0-2:2} verifycode="" verifycode=`mysql -uroot -p111111 -e "select Fverify_code from verify_code_$xx.t_code_$y where Fmobile_no='$mobile' order by Fcreate_time desc limit 1"|grep -v Fverify_code`
if [ !-n $verifycode ]; then echo "fail"
else echo $verifycode fi
curl "http://172.27.207.203:23080/wx_pay/v1.0/wx_get_sms.cgi?mobile=13xxxxxxxxxx” 或直接在瀏覽器中訪問,返回的就是驗證碼,若不帶參數或者mobile錯誤,則返回的是"fail"