2016-06-30 6 views
2

Приложение fastcgi может считывать каждый параметр из nginx, когда I POST формирует данные на моем сервере, кроме QUERY_STRING. Глядя на CONTENT_LENGTH, вы указываете правильную длину строки, и мой браузер показывает отправленные данные, поэтому я могу только думать, что что-то не установлено или я искал не то место.Не удается получить QUERY_STRING от прокси-приложения к приложению

Мой местоположение файла:

location /testpage/test { 
    include fastcgi_params; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 

    fastcgi_pass unix:/var/run/fcgi-sock.fcgi; 
    fastcgi_param SCRIPT_FILENAME /www/test-app; 
} 

Мой тест приложение:

#include "/usr/local/include/fcgiapp.h" 

int main() 
{ 
    FCGX_Request request; 

    FCGX_Init(); 
    FCGX_InitRequest(&request, 0, 0); 
    while (FCGX_Accept_r(&request) == 0) 
    { 
     FCGX_FPrintF(request.out, "Content-type: text/html\r\n\r\n <h1>Hello World!</h1>"); 

     char* q=FCGX_GetParam("REQUEST_METHOD",request.envp); 
     if(q) FCGX_FPrintF(request.out, "%s", q); 
     else FCGX_FPrintF(request.out, "nope"); 

     q=FCGX_GetParam("QUERY_STRING",request.envp); 
     if(q) FCGX_FPrintF(request.out, "%s", q); 
     else FCGX_FPrintF(request.out, "nope"); 
} 

Я знаю, что нужно разобрать строку, но я просто хочу, чтобы получить строку в первую очередь, и, как я сказал, я могу распечатать REQUEST_METHOD и несколько других параметров, просто не QUERY_STRING.

+0

Каков ваш URL? –

ответ

1

В обычном POST данные не находятся в QUERY_STRING, а вместо этого передаются в CGI-процесс через stdin. Посмотрите на FCGX_Request.in.

У вас может также иметь QUERY_STING, если ваш URL имеет ?a=b, но это не нормально для POST.

+0

Я должен был это знать. Теперь я вижу отпечаток мусора, а не данные формы. Я предполагаю, что я его не разбирал, и, икру, нет даже терминатора? FCGX_FPrintF (request.out, "% s", request.in); – Rob

+0

У вас есть CONTENT_LENGTH - я не знаю, получаете ли вы EOF, но не должно быть терминатора. Request.in не является строкой - это Stream. Вы используете его, как если бы вы использовали FILE * –

+0

Отредактировал мой комментарий. Правильно ли это? запрос инициализируется с помощью FCGX_InitRequest (& request) – Rob