2017-02-14 2 views
0

mon nginx/conf.d/default.conf estFCGX_GetParam REQUEST_METHOD peut être utilisé dans les fenêtres, mais retour NULL dans linux

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; 
} 

}

mon code est comme ça, dans les fenêtres, il peut être utilisé avec succès , mais dans Linux je ne peux pas obtenir "char * méthode = FCGX_GetParam (" REQUEST_METHOD ", request.envp)", "méthode" retour NULL, j'ai installé php-fpm, que puis-je faire pour comment résoudre ce problème est quelques erreurs dans les configs de mon nginx? Qui peut m'aider? Réservoirs pour chaque chers camarades de classe !!!

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; 
} 

Répondre

0

La plupart (sinon toutes) nginx distributions sont fournies avec un fichier appelé /etc/nginx/fastcgi_params qui comprend un certain nombre de fastcgi_param déclarations, y compris:

fastcgi_param REQUEST_METHOD $request_method; 

Soit, comprennent le fichier avant vos relevés personnalisés:

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; 
} 

Ou ajoutez simplement la définition REQUEST_METHOD à votre liste existante.

Voir this document pour plus.

+0

réservoirs pour votre réponse !! J'ai trouvé la raison; Nginx config peut-être pas exactement! mais je peux obtenir la valeur par le code dans Linux comme est: –

+0

Merci pour votre réponse !! Je trouve la raison; Je teste le nouveau code qui ne peut pas être utilisé dans Windows mais peut être utilisé sous linux (je ne sais pas pourquoi), code comme ceci: –

+0

int main() { \t CGIWorld * g_pTheWorld = new CGIWorld(); \t extern char ** environ; \t char ** initialEnv = environ; \t while (FCGI_Accept()> = 0) { \t \t \t CIfBase * IFOBJ = CIfFactory :: getIfObj(); \t \t if (IFOBJ == NULL) \t \t { \t \t \t LogError ("error_env_platform", ""); \t \t \t continuer; \t \t} \t \t char * = my_getenv méthode ("REQUEST_METHOD"); \t \t char * pPathInfo = my_getenv ("PATH_INFO"); \t \t ifobj-> SetServName (my_getenv ("SERVER_NAME")); \t \t \t char * pszReq = my_getenv ("QUERY_STRING"); \t \t char * remote_addr = my_getenv ("REMOTE_ADDR"); \t} } –