FCGX_GetParam REQUEST_METHOD可以在Windows中使用,但在Linux中返回NULL

FCGX_GetParam REQUEST_METHOD can used in windows but return NULL in linux

本文关键字:Linux NULL 返回 但在 Windows REQUEST GetParam METHOD FCGX      更新时间:2023-10-16

my nginx/conf.d/default.conf is

server {
listen       80;
server_name  127.0.0.1;
#charset koi8-r;
#access_log  /var/log/nginx/log/host.access.log  main;
location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}
rewrite ^(.*)(?i)charge(.*)$ $1charge$2 break;
rewrite ^(.*)(?i)login(.*)$ $1login$2 break;
rewrite ^(.*)(?i)plat_api(.*)$ $1plat_api$2 break;

location ~charge$  {
    root          /data/servers/NewGame_Server/fcgi_bin;
    fastcgi_pass  127.0.0.1:9991;
    fastcgi_index index.cgi;
    set $real_script_name $fastcgi_script_name;
    if ($fastcgi_script_name ~ "^(.+?.cgi)(/.+)$") {
        set $real_script_name $1;
        set $path_info $2;
    }
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
}

}

我的代码是这样的,在Windows中可以成功使用,但是在Linux中我无法得到"char * method = FCGX_GetParam("REQUEST_METHOD", request.envp(","方法"返回 NULL,我已经安装了 php-fpm,我能做些什么来如何解决这个问题?我的nginx配置中是否存在一些错误?谁能帮助我?每个亲爱的同学的坦克!!

int main()
{
FCGX_Request& request = g_pTheWorld->GetFCGX_Request();
    streambuf * cin_streambuf = cin.rdbuf();
    streambuf * cout_streambuf = cout.rdbuf();
    streambuf * cerr_streambuf = cerr.rdbuf();
    FCGX_Init();
    FCGX_InitRequest(&request, 0, 0);
    while (FCGX_Accept_r(&request) == 0)
    {
        CIfBase* ifobj = CIfFactory::getIfObj();
        if (ifobj == NULL)
        {
            LogError("error_env_platform", "");
            continue;
        }
        // Note that the default bufsize (0) will cause the use of iostream
        // methods that require positioning (such as peek(), seek(),
        // unget() and putback()) to fail (in favour of more efficient IO).
        fcgi_streambuf cin_fcgi_streambuf(request.in);
        fcgi_streambuf cout_fcgi_streambuf(request.out);
        fcgi_streambuf cerr_fcgi_streambuf(request.err);
#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF
        cin = &cin_fcgi_streambuf;
        cout = &cout_fcgi_streambuf;
        cerr = &cerr_fcgi_streambuf;
#else
        cin.rdbuf(&cin_fcgi_streambuf);
        cout.rdbuf(&cout_fcgi_streambuf);
        cerr.rdbuf(&cerr_fcgi_streambuf);
#endif
        //setvbuf(stdin, NULL, _IONBF, 0);     /*关闭stdin的缓冲*/
        char * method = FCGX_GetParam("REQUEST_METHOD", request.envp);
        if (method == NULL)
        {
            LogError("REQUEST_METHOD","error : size = 0");
            continue;
        }
        string intput;
        if (strcmp(method, "GET") == 0)
        {
            intput = FCGX_GetParam("QUERY_STRING", request.envp);
        }
        else if (strcmp(method, "POST") == 0)
        {
            intput = get_request_content(request);
        }
        FCGX_Finish_r(&request);
    }
#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF
    cin = cin_streambuf;
    cout = cout_streambuf;
    cerr = cerr_streambuf;
#else
    cin.rdbuf(cin_streambuf);
    cout.rdbuf(cout_streambuf);
    cerr.rdbuf(cerr_streambuf);
#endif
    delete g_pTheWorld;
    return 0;
}

大多数(如果不是全部(nginx发行版都带有一个名为 /etc/nginx/fastcgi_params 的文件,其中包含许多 fastcgi_param 语句,包括:

fastcgi_param   REQUEST_METHOD   $request_method;

或者,在自定义语句之前包含该文件:

location ~charge$  {
    ...
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
}

或者只是将REQUEST_METHOD定义添加到现有列表中。

有关详细信息,请参阅此文档。