lighttpd: ajax 요청은 실행하는 대신 cgi 스크립트의 내용을 인쇄합니다.

lighttpd: ajax 요청은 실행하는 대신 cgi 스크립트의 내용을 인쇄합니다.

ARM 환경에서 lighttpd 버전 1.4.55를 사용하고 있습니다. 일부 json 데이터를 다운로드하는 버튼이 있는 HTML 페이지를 만들었습니다. 이 버튼은 CGI 스크립트를 호출하는 양식 제출을 트리거합니다. 스크립트는 양식의 출력을 가져와 파일에 작성해야 합니다. 그러나 버튼을 클릭하면 xhr 요청의 응답 텍스트는 printf 메시지 대신 cgi 스크립트의 내용입니다. cgi에는 실행 권한이 있습니다.

폴더를 다음과 같이 나눕니다.

•mnt/userfs/lighttpd/
    •www
        • /scripts_files
            json.cgi
        • /html_files
            •css folder
            •js folder
        • upload_dir
        • index.html
        • /admin
            • password_file
            • main.html
            • file_upload.html
        • /user
            • password_file
            • main.html
            • file_upload.html
    •lighttpd.conf
    •log
        •error.log

양식을 호출하는 버튼은 다음과 같습니다.

<a href="/scripts_files/conf.json" download="data.json">            
    <input type="button" value="DOWNLOAD" onclick="submit_form();">
</a>

버튼은 함수를 호출하고 .cgi 스크립트를 사용하여 생성된 파일을 다운로드합니다.

Ajax 요청 기능:

function submit_form()
    {
        var div1 = document.getElementById("extern");
        var data = {};
        data = recursive_f(div1, 0, 0);
        output = JSON.stringify(data);
        var xhr_lv = new XMLHttpRequest();
        xhr_lv.onreadystatechange=function()
        xhr_lv.open("POST", "/scripts_files/json.cgi", true);
        xhr_lv.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
        xhr_lv.send(output);
    }

.cgi 스크립트를 생성하는 C 프로그램:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{
    char* post_len_v = getenv("CONTENT_LENGTH");
    long post_len = strtol(post_len_v, NULL, 10);
    char* post_msg = (char*)malloc(post_len + 1);
    FILE *fp;


    if (!post_msg)
    { 
        return 0; 
    }
    fgets(post_msg, post_len + 1, stdin);      

    fp = fopen("/mnt/userfs/lighttpd/www/scripts_files/conf.json", "w");

    fprintf(fp, "%s", post_msg);
    fclose(fp);

    printf("Content-type: application/json\n\n");

    return 0;
}

Lighttpd 구성 파일:

server.modules              = (
                "mod_indexfile",
                "mod_access",
                "mod_redirect",
                "mod_alias",
                "mod_compress",
                "mod_dirlisting",
                "mod_staticfile",
                "mod_auth",
                "mod_authn_file",
                "mod_accesslog",
                "mod_cgi",
                #"mod_rewrite",
                #"mod_status"
                #"mod_fastcgi"
)

server.document-root        = "/mnt/userfs/lighttpd/www"


server.errorlog             = "/mnt/userfs/lighttpd/log/error.log"
server.breakagelog         = "/mnt/userfs/lighttpd/log/breakage.log"

index-file.names            = ("index.html", "main.html", "file_upload.html")

mimetype.assign = (
    ".class" => "application/java-vm",
    ".js" => "application/javascript",
    ".mjs" => "application/javascript",
    ".json" => "application/json",
    ".jsonld" => "application/ld+json",
    ".wmx" => "video/x-ms-wmx",
    ".wvx" => "video/x-ms-wvx",
    ".avi" => "video/x-msvideo",
    ".movie" => "video/x-sgi-movie",
    ".ice" => "x-conference/x-cooltalk",
    ".sisx" => "x-epoc/x-sisx-app",
    ".vrm" => "x-world/x-vrml",
    "README" => "text/plain; charset=utf-8",
    "Makefile" => "text/x-makefile; charset=utf-8",
    
    # enable caching for unknown mime types:
    #"" => "application/octet-stream"
)

mimetype.use-xattr        = "disable" 

url.access-deny             = ( "~", ".inc" )

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

server.port                = 80

server.username            = "midac"
server.groupname           = "midac"

#compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

cgi.assign = ( ".cgi" => "" )

$HTTP["url"] =~ "/admin" {
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/mnt/userfs/lighttpd/www/admin/.htpasswd"
auth.require = ( "/admin" => (
    "method" => "basic", 
    "realm" => "main", 
    "require" => "valid-user") 
)
}

$HTTP["url"] =~ "/user" {
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/mnt/userfs/lighttpd/www/user/.htpasswd"
auth.require = ( "/user" => (
    "method" => "basic", 
    "realm" => "main", 
    "require" => "valid-user") 
)
}

$HTTP["url"] =~ "/user2" {
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/mnt/userfs/lighttpd/www/user2/.htpasswd"
auth.require = ( "/user2" => (
    "method" => "basic", 
    "realm" => "main", 
    "require" => "valid-user") 
)
}

또한 샘플 cgi 스크립트를 시도했지만 다음과 같은 결과를 얻었습니다.

#!/bin/sh

echo hello

그래서 CGI 스크립트의 내용입니다.

POST 요청 유형은 옥텟 스트림입니다. cgi_mod가 제대로 작동하지 않거나 lighttpd 구성 파일에서 뭔가를 놓친 것 같습니다.

어떤 제안이 있으십니까?

답변1

이 질문은 다른 장소에 "얼마나 많은지 모릅니다"에 여러 번 게시되었습니다. 답변자:https://serverfault.com/questions/1125701/lighttpd-ajax-request-prints-the-content-of-cgi-script-instead-of-running-it/1133316#1133316

관련 정보