报错
功能是前端请求一张图片,但总是报错,502 Bad Gateway The CGI was not CGI/1.1 compliant.
<HTML><HEAD><TITLE>502 Bad Gateway</TITLE></HEAD> <BODY><H1>502 Bad Gateway</H1> The CGI was not CGI/1.1 compliant. </BODY></HTML>
/var/log/boa/error_log
[06/May/2025:06:36:39 +0000] cgi_header: unable to find LFLF
cgi-bin程序
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#define IMAGE_FILE "/var/www/predict_image.jpg"
int main() {
int fd;
char buffer[1024];
ssize_t bytes_read;
off_t file_size;
// 打开图片文件
fd = open(IMAGE_FILE, O_RDONLY);
if (fd == -1) {
// 如果文件打开失败,返回错误信息
fprintf(stderr, "Failed to open image file: %s\n", IMAGE_FILE);
return 1;
}
// 获取文件大小
file_size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET); // 重置文件指针到文件开头
// 设置 HTTP 响应头
printf("Content-Type: image/jpeg\r\n");
printf("Content-Length: %ld\r\n\r\n", file_size);
// 读取图片文件内容并发送到客户端
while ((bytes_read = read(fd, buffer, sizeof(buffer))) > 0) {
write(STDOUT_FILENO, buffer, bytes_read);
}
// 关闭文件描述符
close(fd);
return 0;
}
解决
看了网上一大把对这个问题的解决办法,试了遍,没卵用,全都是弟弟,说不到点子上
还得要我亲自下场,深入代码,仔细分析
发现人家源码应该没问题,是IO缓冲的问题,printf不会立马写,而write会立马写,所以就会出现这种情况:write写的内容反而在printf前面,或者printf写的内容压根没进内核,还在库中的buffer里,导致boa解析出错
知道这个原因后,不用printf,全都用write,问题解决,牛不牛逼,全网独我一份,网上其它的解决办法全是垃圾
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#define IMAGE_FILE "/var/www/predict_image.jpg"
int main() {
int fd;
char buffer[1024];
ssize_t bytes_read;
off_t file_size;
// 打开图片文件
fd = open(IMAGE_FILE, O_RDONLY);
if (fd == -1) {
// 如果文件打开失败,返回错误信息
fprintf(stderr, "Failed to open image file: %s\n", IMAGE_FILE);
return 1;
}
// 获取文件大小
file_size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET); // 重置文件指针到文件开头
// 设置 HTTP 响应头
snprintf(buffer, sizeof(buffer), "Content-Type: image/jpeg\r\n");
write(STDOUT_FILENO, buffer, strlen(buffer));
snprintf(buffer, sizeof(buffer), "Content-Length: %ld\r\n\r\n", file_size);
write(STDOUT_FILENO, buffer, strlen(buffer));
// 读取图片文件内容并发送到客户端
while ((bytes_read = read(fd, buffer, sizeof(buffer))) > 0) {
write(STDOUT_FILENO, buffer, bytes_read);
}
// 关闭文件描述符
close(fd);
return 0;
}