ARM环境下lighttpd 1.4.55中CGI脚本未执行,返回内容问题求助
问题解决方案
核心问题定位
lighttpd直接返回CGI脚本内容而非执行结果,通常是因为静态文件处理优先级高于CGI模块,或脚本本身不具备可执行条件。
具体修复步骤
1. 调整lighttpd静态文件排除配置
在lighttpd.conf中,修改static-file.exclude-extensions,添加.cgi后缀,避免将CGI脚本当作静态文件返回:
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".cgi" )
2. 验证CGI脚本的可执行性
- Shell脚本(示例脚本):
- 添加执行权限:
chmod +x /mnt/userfs/lighttpd/www/scripts_files/test.cgi - 确认shebang
#!/bin/sh指向ARM环境中存在的shell路径,可通过which sh验证路径正确性。
- 添加执行权限:
- C编译的json.cgi:
- 必须使用ARM架构的编译器编译(交叉编译或本地ARM编译器),不能用x86平台的编译产物。编译命令示例:
arm-linux-gnueabihf-gcc json.c -o json.cgi - 添加执行权限:
chmod +x json.cgi
- 必须使用ARM架构的编译器编译(交叉编译或本地ARM编译器),不能用x86平台的编译产物。编译命令示例:
3. 检查lighttpd CGI配置有效性
- 确认
server.modules中已包含"mod_cgi"(你的配置已满足此条件)。 cgi.assign配置(".cgi" => "")正确,表示直接执行.cgi后缀的可执行文件,无需额外解释器。- 用
lighttpd -t -f /mnt/userfs/lighttpd/lighttpd.conf验证配置语法,无报错后重启lighttpd。
4. 修复文件权限与路径问题
- 确保
scripts_files目录及json.cgi文件对lighttpd运行用户midac具备读+执行权限:chown midac:midac /mnt/userfs/lighttpd/www/scripts_files/ -R chmod 755 /mnt/userfs/lighttpd/www/scripts_files/ -R - 确认
conf.json的写入路径/mnt/userfs/lighttpd/www/scripts_files/对midac用户具备写权限,否则CGI脚本无法生成文件。
5. 修正C代码中的潜在问题
- 处理
CONTENT_LENGTH为空的边界情况,避免strtol崩溃:char* post_len_v = getenv("CONTENT_LENGTH"); long post_len = 0; if (post_len_v != NULL) { post_len = strtol(post_len_v, NULL, 10); } - 输出符合标准JSON格式,将单引号改为双引号:
printf("Content-type: text/html\n\n"); printf("{\"ret\": \"OK\"}");
6. 完善AJAX请求逻辑
补全onreadystatechange函数体,确保能正确接收和处理响应:
function submit_form() { var div1 = document.getElementById("extern"); var data = recursive_f(div1, 0, 0); var output = JSON.stringify(data); var xhr_lv = new XMLHttpRequest(); xhr_lv.onreadystatechange = function() { if (xhr_lv.readyState === 4 && xhr_lv.status === 200) { console.log("响应结果:", xhr_lv.responseText); // 可在此处添加下载逻辑或提示信息 } }; xhr_lv.open("POST", "/scripts_files/json.cgi", true); xhr_lv.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); xhr_lv.send(output); }
内容的提问来源于stack exchange,提问作者marco
相关产品推荐
相关产品推荐

