目录
引言
前几天的博客介绍了lighttpd下配置CGI程序的方法:Lighttpd CGI配置:404错误排查实录-CSDN博客。学生在实践中又遇到一个问题,就是用C语言编写的CGI程序不知道为什么总是不能执行。
问题现象
我编写了一个最简单的CGI程序来说明问题。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Content-Type: text\r\n\r\n");
printf("Hello from cgi program\r\n");
return 0;
}
使用下面的命令行进行编译:
arm-none-linux-gnueabi-gcc -o hello.cgi hello.c
然后在开发板上部署这个程序,可以现在命令行运行一下。
程序可以正常运行。
然后在浏览器中访问CGI程序就没有任何反应了。用Wireshark抓包,可以看到lighttpd返回200 OK,但是没有任何内容。
从返回的Content-length看出是0。
解决方法
在上一篇博文提到,修改/var/lighttpd/config/conf.d/cgi.conf文件,以指定 Bash 脚本作为 CGI 处理程序。
#######################################################################
##
## CGI modules
## ---------------
##
## http://www.lighttpd.net/documentation/cgi.html
##
server.modules += ( "mod_cgi" )
##
## Plain old CGI handling
##
## For PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini.
##
cgi.assign = ( ".pl" => "/usr/bin/perl",
".cgi" => "/bin/bash",
".rb" => "/usr/bin/ruby",
".erb" => "/usr/bin/eruby",
".py" => "/usr/bin/python" )
上一个例子和此次有点不同。上次是用Shell脚本写了cgi程序,在脚本中调用的C语言生成的可执行文件,而这次是直接用C语言生成了可执行文件。如果 还用这个配置文件,就意味着C语言生成的可执行程序被当做shell脚本运行,所以不会返回预期的结果。
所以要修改一下配置文件,增加一行:
cgi.assign = ( ".pl" => "/usr/bin/perl",
".cgi" => "/bin/bash",
".prg" => "",
".rb" => "/usr/bin/ruby",
".erb" => "/usr/bin/eruby",
".py" => "/usr/bin/python" )
增加的这一行意思是对于扩展名为.prg的cgi程序,直接当做可执行程序运行。然后把cgi程序改为hello.prg,再执行就对了。
结束语
希望这些内容能为您带来启发或帮助。如果您有任何疑问或想法,欢迎在评论区交流分享。
感谢阅读,期待下次与您相遇!