Nginx proxy\u pass缺少错误正文

Nginx proxy\u pass缺少错误正文,nginx,error-handling,http-status-code-404,httpresponse,Nginx,Error Handling,Http Status Code 404,Httpresponse,下面是一个非常标准的nginx proxy\u pass设置: 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 / { } locat

下面是一个非常标准的nginx proxy\u pass设置:

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;
  }
}
我代理的API返回的响应体包含400、404和500个错误代码的错误信息。例如,在404上,我的响应主体可能如下所示:

{
  "errorCode": "TOKEN_NOT_FOUND",
  "errorMessages": [
    "Could not find a matching authorization token."
  ]
}
如果我在没有代理的情况下执行请求,我将获得错误的响应主体

如果我使用nginx代理,由于某种原因,响应主体会被nginx吞没,甚至在我的web浏览器网络选项卡中根本看不到响应


有没有办法告诉Nginx在代理传递中返回错误代码的响应体?

今天我将Laravel 5.2从IIS 8.5迁移到Ubuntu 16.04(Nginx 1.10.0-PHP-FPM 7.0.10),我也有同样的问题。当Angular2发出请求时,服务器的正文响应始终为空。但邮递员还是得到了回复。 所以这一定是请求头的问题

此配置可帮助我解决上述问题:

    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';
添加头的第三个参数仅在最新的nginx版本中可用。

请参阅

  • 根据Alexey的评论——“浏览器需要标题来允许访问响应体。我想,您需要始终标记
    add_header
  • 由于nginx 1.7.5,即使在错误响应中,您也可以使用关键字
    always
    来包含标题-因此,您可以按如下方式设置nginx.conf:
  • -


    我最近遇到了同样的问题

    最后一个问题是:添加代理头升级

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    
    我的完整配置如下所示:

    upstream cloud-api {
            server 127.0.0.1:8089;
    }
    
    client_max_body_size 20M;
    client_header_buffer_size 8k;
    large_client_header_buffers 4 16k;
    
    server {
            listen 8001;
            access_log  /data/senseid-cloud-log/senseid-cloud-api-access.log;
            error_log  /data/senseid-cloud-log/senseid-cloud-api-error.log warn;
    
            location / {
                    proxy_http_version 1.1;
                    proxy_set_header Host $http_host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection 'upgrade';
    
                    proxy_read_timeout 300s;
                    proxy_pass http://cloud-api;
            }
    }
    
    你们可以捕捉到500/401等错误体

    详情:


    希望能给你一些帮助。

    仔细阅读@AlexeyTen我需要的不是标题,而是回复正文本身。我做了一些进一步的挖掘,结果显示正文实际上已经返回了,但是被浏览器本身吞没了。这是因为浏览器需要标题来允许访问响应正文。我想,您需要
    始终
    标记
    add_header
    @AlexeyTen,所以我实际上比较了直接请求和代理请求的响应头,它们是相同的。唯一不同的是,来自浏览器的代理请求包含localhost的Origin和referer头,而非代理请求包含X-request-With头。显示完整服务器配置\
    upstream cloud-api {
            server 127.0.0.1:8089;
    }
    
    client_max_body_size 20M;
    client_header_buffer_size 8k;
    large_client_header_buffers 4 16k;
    
    server {
            listen 8001;
            access_log  /data/senseid-cloud-log/senseid-cloud-api-access.log;
            error_log  /data/senseid-cloud-log/senseid-cloud-api-error.log warn;
    
            location / {
                    proxy_http_version 1.1;
                    proxy_set_header Host $http_host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection 'upgrade';
    
                    proxy_read_timeout 300s;
                    proxy_pass http://cloud-api;
            }
    }