2016-05-05 8 views
1

Unten ist ein ziemlich Standard nginx proxy_pass Setup:Nginx proxy_pass fehlt Fehler Körper

server { 
    listen 80; 
    server_name ireport.jungdigital.com; 
    access_log /var/log/nginx/ireport.access.log; 
    root /var/www/ireport.jungdigital.com/dist; 
    index index.html index.htm; 
    location/{  
    } 
    location /api/ { 
    if ($request_method = 'OPTIONS') { 
     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Reques 
     add_header 'Access-Control-Max-Age' 1728000; 
     add_header 'Content-Type' 'text/plain charset=UTF-8'; 
     add_header 'Content-Length' 0; 
     return 204; 
    } 
    if ($request_method = 'POST') { 
     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Reques 
    } 
    if ($request_method = 'PUT') { 
     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Reques 
    } 
    if ($request_method = 'GET') { 
     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Reques 
    } 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-NginX-proxy true; 
    proxy_set_header Host ireport.somehost.org; 
    proxy_pass http://ireport_dyndns/api/; 
    proxy_ssl_session_reuse off; 
    proxy_redirect off; 
    } 
} 

Die API, die ich Proxying kehrt Reaktion des Körpers, die Fehlerinformationen enthalten, die für 400, 404 und 500 Fehlercodes. Zum Beispiel auf einem 404, meine Antwort Körper aussehen könnte:

{ 
    "errorCode": "TOKEN_NOT_FOUND", 
    "errorMessages": [ 
    "Could not find a matching authorization token." 
    ] 
} 

Wenn ich die Anfrage ohne den Proxy ausführen, bekomme ich die Antwort Körper für die Fehler.

Wenn ich den Nginx-Proxy verwende, werden die Antwort-Körper aus irgendeinem Grund von Nginx verschluckt und ich sehe überhaupt keine Antwort in meinem Web-Browser Netzwerk-Tab.

Gibt es eine Möglichkeit, Nginx mitzuteilen, Antwortkörper für Fehlercodes in einem Proxy_pass zurückzugeben?

+0

Vorsichtig lesen http://nginx.org/r/add_header –

+0

@AlexeyTen Es ist kein Header, den ich brauche, es ist der Antwortkörper selbst. Ich habe etwas mehr gegraben und es scheint, dass der Körper tatsächlich zurückgegeben wird, aber vom Browser selbst verschluckt wird. – JoshJ

+0

Das liegt daran, dass Browser Header benötigen, um den Zugriff auf den Antworttext zu ermöglichen. Ich denke, Sie brauchen 'immer' Flag für 'add_header' –

Antwort

0

Heute verschiebe ich Laravel 5.2 von IIS 8.5 zu Ubuntu 16.04 (Nginx 1.10.0 - PHP-FPM 7.0.10), ich habe das gleiche Problem. Die Körperantwort vom Server ist immer leer, wenn eine Anfrage von Angular2 erfolgt. Aber der Postbote bekommt immer noch eine Antwort. Das muss also ein Problem mit Request-Headern sein.

add_header 'Access-Control-Allow-Origin' '*' 'always'; 
    add_header 'Access-Control-Allow-Credentials' 'true' 'always'; 
    add_header 'Access-Control-Allow-Methods' 'GET, POST, DELETE, PUT, OPTIONS, HEAD' 'always'; 
    add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, X-Requested-With' 'always'; 

dritte Parameter für add_header nur in den letzten nginx Version: oben

Diese Config mir Problem gelöst helfen.

0

Siehe How to add a response header on nginx when using proxy_pass?

  1. Per Alexey Kommentar - „Browser-Header benötigen Zugriff auf Antworttext zu ermöglichen, ich denke, Sie müssen immer Flagge für add_header
  2. Seit nginx 1.7.5 können Sie das Schlüsselwort always zu Header auch in Fehlerreaktionen sind - so können Sie Setup Ihre nginx.conf wie folgt:

-

server { 
    server_name .myserver.com 
    location/{ 
     proxy_pass http://mybackend; 
     add_header X-Upstream $upstream_addr always; 
    } 
}