Perl CGI脚本引入echarts.js报AH01215错误,请求排查适配问题
Perl CGI引入echarts.js引发的执行格式错误分析
错误日志
[Fri Aug 25 10:07:17.488252 2023] [cgi:error] [pid xx] [client xxxx] AH01215: (8)Exec format error: exec of '/cgi-bin/echarts.js' failed, referer: http://xxxx/cgi-bin/jindl_test.pl [Fri Aug 25 10:07:17.488731 2023] [cgi:error] [pid xx] [client xxxx] End of script output before headers: echarts.js, referer: http://xxxx/cgi-bin/jindl_test.pl
对应的Perl CGI脚本
#!/usr/local/bin/perl5 -w print "Content-type: text/html "; use CGI qw(:standard); use CGI qw(:cgi); print "<html> "; print "<head> "; print "<title>test</title> "; print "<script src=\"echarts.js\"></script> "; print "</head> "; print "<body> "; print "<div id=\"main\" style=\"width: 600px;height:400px;\"></div> "; print "<script type=\"text/javascript\">"; print "var myChart = echarts.init(document.getElementById('main')); "; print "var option = { "; print "title: {text: 'Demo'}, "; print "tooltip: {}, "; print "xAxis: {data: ['Shirts', 'Cardigans', 'Chiffons', 'Pants', 'Heels', 'Socks']}, "; print "yAxis: {type: 'value'}, "; print "series: [ "; print "{name: 'sales', data: [120, 200, 150, 120], type: 'line'}, "; print "{name: 'values', data: [100, 300, 250, 100], type: 'line' } "; print "], "; print "legend: {data: ['sales','values']} "; print "}; "; print "myChart.setOption(option); "; print "</script> "; print "</body></html> ";
问题
当前存在echarts.js和上述Perl脚本两个文件,脚本通过<script src="echarts.js"></script>引入该JS文件,请问该脚本是否存在不合适的地方导致报错?
原因与解决办法
核心错误原因
Apache将echarts.js当作CGI脚本执行了:
- 你的
echarts.js和Perl脚本都放在了cgi-bin目录下,而该目录默认配置为所有文件都作为可执行CGI程序处理,而非静态资源。 - 当浏览器请求
echarts.js时,Apache尝试执行它,但JS文件不是可执行脚本(没有CGI要求的shebang头,也不是二进制程序),因此抛出Exec format error;同时因为JS文件没有输出CGI必须的HTTP响应头,又触发End of script output before headers错误。
脚本中的问题
脚本里的<script src="echarts.js"></script>使用了相对路径,浏览器会自动拼接为http://xxxx/cgi-bin/echarts.js请求该文件,刚好命中CGI执行目录的规则,导致错误。
解决办法
迁移静态文件到非CGI目录(推荐)
- 将
echarts.js移动到网站根目录下的静态资源子目录(比如js/文件夹),然后修改Perl脚本中的引入路径:print "<script src=\"/js/echarts.js\"></script> ";
- 将
修改Apache配置,允许cgi-bin目录下的JS文件作为静态资源返回
- 在Apache的配置文件中,找到
cgi-bin目录的<Directory>配置块,添加针对.js后缀的规则:<Directory "/path/to/your/cgi-bin"> # 原有配置 Options +ExecCGI AddHandler cgi-script .pl .cgi # 添加以下规则 <FilesMatch "\.js$"> SetHandler default-handler </FilesMatch> </Directory> - 修改后重启Apache服务。
- 在Apache的配置文件中,找到
脚本冗余代码优化
- 脚本中重复加载了CGI模块:
use CGI qw(:standard);和use CGI qw(:cgi);,保留其中一个即可,这部分不影响当前错误,但可以简化代码。
- 脚本中重复加载了CGI模块:
内容的提问来源于stack exchange,提问作者Rey Lee
相关产品推荐
相关产品推荐

