CGI中的星星点点
时间:2007-12-12 来源:jacky.lee
CGI中的星星点点
今天写一个CGI程序,运行后提示什么内部错误,搞的我头晕目眩的,查看了下错误日志:
Wed Dec 12 21:47:32 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:47:33 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:54:20 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:54:21 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:54:54 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:55:12 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:55:13 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:55:13 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
意思是指程序输出头部有误,可是我用perl写了一个CGI运行正确,上网查了一下找到了解决问题的方法,如下所示:
如果用shell写的话,第一句一定要先定义内型,然后跟着是一个新空行,在下来就是主程序了,由于我在定义内型后没有跟着换行,直接就是主程序,所以一才导致上面出现的错误。
1、不管URL中有没有问号,QUERY_STRING这个环境变量是一定是有的,区别只在于变量是否是空的。
2、CONTENT_LENGTH这个环境变量只有在使用了POST方法时才会被设置。如果根据CONTENT_LENGTH的值动态申请内存存储 POST上来的数据的话,那么需要先将CONTENT_LENGTH经过atoi()转换后,再判断这个值是不是0,如果是0的话,就没必要去 malloc()了。
3、与CGI无关:系统IO函数(如read(),write())与标准IO函数(如printf(),fprintf())在混合使用的情况下,会出现一些不可预期的行为。当不可避免地出现混用时,记得在标准IO函数结束后使用系统IO函数之前fflush()一下。
4、CGI不执行,APACHE错误日志里报错:file permissions deny server execution,可能的原因为文件权限不正确,例如umask设置错误导致编译出来的CGI执行权限为766(rwxrw-rw-)。
5、CGI不执行,APACHE错误日志:Premature end of script headers,或 malformed header from script. Bad headerXXX,这种情况,还是检查一下CGI输出的第一句话是啥。应该是形如:
Content-type:text/html\n\n
注意:声明好Content-type后要输出两个空行。
今天写一个CGI程序,运行后提示什么内部错误,搞的我头晕目眩的,查看了下错误日志:
Wed Dec 12 21:47:32 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:47:33 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:54:20 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:54:21 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:54:54 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:55:12 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:55:13 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
[Wed Dec 12 21:55:13 2007] [error] [client 192.168.1.121] malformed header from script. Bad header=apache: test.sh
意思是指程序输出头部有误,可是我用perl写了一个CGI运行正确,上网查了一下找到了解决问题的方法,如下所示:
如果用shell写的话,第一句一定要先定义内型,然后跟着是一个新空行,在下来就是主程序了,由于我在定义内型后没有跟着换行,直接就是主程序,所以一才导致上面出现的错误。
1、不管URL中有没有问号,QUERY_STRING这个环境变量是一定是有的,区别只在于变量是否是空的。
2、CONTENT_LENGTH这个环境变量只有在使用了POST方法时才会被设置。如果根据CONTENT_LENGTH的值动态申请内存存储 POST上来的数据的话,那么需要先将CONTENT_LENGTH经过atoi()转换后,再判断这个值是不是0,如果是0的话,就没必要去 malloc()了。
3、与CGI无关:系统IO函数(如read(),write())与标准IO函数(如printf(),fprintf())在混合使用的情况下,会出现一些不可预期的行为。当不可避免地出现混用时,记得在标准IO函数结束后使用系统IO函数之前fflush()一下。
4、CGI不执行,APACHE错误日志里报错:file permissions deny server execution,可能的原因为文件权限不正确,例如umask设置错误导致编译出来的CGI执行权限为766(rwxrw-rw-)。
5、CGI不执行,APACHE错误日志:Premature end of script headers,或 malformed header from script. Bad headerXXX,这种情况,还是检查一下CGI输出的第一句话是啥。应该是形如:
Content-type:text/html\n\n
注意:声明好Content-type后要输出两个空行。
相关阅读 更多 +