2016-06-30 4 views
2

Meine FastCgi-Anwendung kann jeden Parameter von Nginx lesen, wenn ich mit Ausnahme von QUERY_STRING Daten an meinen Server anschließe. Wenn man CONTENT_LENGTH anschaut, erhält man die korrekte Länge der Zeichenfolge und mein Browser zeigt die gesendeten Daten an, so dass ich nur denke, dass etwas nicht gesetzt ist oder ich an der falschen Stelle suche.QUERY_STRING kann nicht vom Proxy zur Anwendung gelangen

Meine Standort-Datei:

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

Mein 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"); 
} 

Ich weiß, ich brauche die Zeichenfolge zu analysieren, aber ich möchte nur die Zeichenfolge an erster Stelle und bekommen, wie ich sagte, ich kann REQUEST_METHOD und mehrere andere Parameter ausdrucken, nur nicht QUERY_STRING.

+0

Wie lautet Ihre URL? –

Antwort

1

In einem normalen POST befinden sich die Daten nicht in QUERY_STRING, sondern werden stattdessen über STDIN an den CGI-Prozess übergeben. Schauen Sie sich FCGX_Request.in an.

Sie könnte auch eine QUERY_STING haben, wenn Ihre URL ?a=b drin hat, aber das ist nicht normal für einen POST.

+0

Ich hätte das wissen müssen. Ich sehe Müll jetzt gedruckt, nicht die Formulardaten. Ich nehme an, weil ich es nicht analysiert habe und, iirc, gibt es nicht einmal einen Terminator? FCGX_FPrintF (request.out, "% s", request.in); – Rob

+0

Sie haben CONTENT_LENGTH - Ich weiß nicht, ob Sie EOF bekommen, aber es sollte kein Terminator sein. Request.in ist keine Zeichenkette - es ist ein Stream. Sie verwenden es wie Sie FILE verwenden würden * –

+0

Bearbeitete meinen Kommentar. Sieht das richtig aus? Anfrage wird mit FCGX_InitRequest (& Anfrage) initialisiert – Rob