2017-02-14 1 views
0
에 NULL 반환 할 수 있습니다

내의 nginx/conf.d/default.conf는FCGX_GetParam REQUEST_METHOD 윈도우에서 사용하지만 리눅스

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

}

내 코드는 다음과 같다, 창문에 성공적으로 이용 될 수있다 ,하지만 리눅스에서 내가 얻을 수 없다 "char * method = FCGX_GetParam ("REQUEST_METHOD ", request.envp)" "메서드는"NULL을 반환, 내가 어떻게 PHP fpm을 설치했는지, 어떻게 할 수있는 해결 이 문제는? 내 nginx의 configs에 몇 가지 실수가 있습니까? 누가 날 도울 수 있죠? 모든 친애하는 동급생을위한 탱크 !!!

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

답변

0

(모든 경우) nginx 배포판의 파일이 포함 fastcgi_param 문 다수 포함 /etc/nginx/fastcgi_params 전화와 함께 대부분의 :

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 정의를 추가하십시오.

자세한 내용은 this document을 참조하십시오.

+0

당신의 대답을위한 탱크 !! 나는 이성을 발견했다. nginx 설정 어쩌면 정확하지 않을 수도 있습니다!하지만 같은 리눅스에서 코드에 의해 값을 얻을 수 있습니다 : –

+0

답변 주셔서 감사합니다! 윈도우에서 사용할 수없는 새로운 코드를 테스트하지만 리눅스에서 사용할 수있는 이유는 모르겠다. 다음과 같은 코드이다. –

+0

int main() { \t CGIWorld * g_pTheWorld = new CGIWorld(); \t extern char ** 환경; \t char ** initialEnv = 환경; \t 동안 (FCGI_Accept에()> = 0) { \t \t \t CIfBase * ifobj = CIfFactory :: getIfObj(); \t \t 경우 (ifobj == NULL) \t \t \t \t { \t LogError ("error_env_platform", ""); \t \t \t 계속; \t \t} \t \t 숯 * = my_getenv 방법 ("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} } –

관련 문제