nginx获取后端返回状态码的问题

Blade 未结 1 2247
8836880
8836880 剑圣 2020-07-30 11:58

一、该问题的重现步骤是什么?

1. 网关的端口为7300,前端页面的端口为8055,存在跨域,现在我在nginx配置了跨域的解决,可以正常调用

2. 岗位新增,填写超出数据库长度的字段,后台报500错误,后端返回的http状态码也为500,浏览器无法获取到http状态码的返回(Chrome浏览器)

3. 同上问题火狐浏览器在开发模式能获取到返回数据,但是浏览器并未提示错误信息

以上2,3问题为500错误

4,岗位新增,后台增加验证重复名称的过程, 重复的名称抛出ServiceException错误,后端返回错误码为400,HTTP状态码也为400,chrome浏览器获取不到返回数据,火狐获取到后无响应

二、你期待的结果是什么?实际看到的又是什么?

到底是nginx的问题?还是跨域问题没有解决?

三、你正在使用的是什么产品,什么版本?在什么操作系统上?

2.5.1 微服务版本和boot版本都有这个问题

四、请提供详细的错误堆栈信息,这很重要。

image.png

五、若有更多详细信息,请在下面提供。

nginx配置

server {

        listen 7300;

        server_name 192.168.2.111;

        

        location / {

           proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://microService/;

        }

        

        location ^~/api/ {

           #Proxy Settings

           #   指定允许跨域的方法,*代表所有

            add_header Access-Control-Allow-Methods *;


            #   预检命令的缓存,如果不缓存每次会发送两次请求

            add_header Access-Control-Max-Age 18000;

            #   带cookie请求需要加上这个字段,并设置为true

            add_header Access-Control-Allow-Credentials true;


            #   表示允许这个域跨域调用(客户端发送请求的域名和端口) 

            #   $http_origin动态获取请求客户端请求的域   不用*的原因是带cookie的请求不支持*号

            add_header Access-Control-Allow-Origin $http_origin;


            #   表示请求头的字段 动态获取

            add_header Access-Control-Allow-Headers $http_access_control_request_headers;


            #   OPTIONS预检命令,预检命令通过时才发送请求

            #   检查请求的类型是不是预检命令

            if ($request_method = OPTIONS){

                return 200;

            }

           proxy_redirect     off;

           proxy_set_header   Host             $host;

           proxy_set_header   X-Real-IP        $remote_addr;

           proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

           proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

           proxy_max_temp_file_size 0;

           proxy_connect_timeout      90;

           proxy_send_timeout         90;

           proxy_read_timeout         90;

           proxy_buffer_size          4k;

           proxy_buffers              4 32k;

           proxy_busy_buffers_size    64k;

           proxy_temp_file_write_size 64k;

           rewrite ^/api/(.*)$ /$1 break;

           proxy_pass  http://microService;

        }

    }


1条回答
  • 你可以调用到后端接口,那就说明没有跨域

    另外你已经用到nginx了就不需要再去配置跨域,只需要配置反向代理,把本是跨域的后端接口地址代理到本地,这样跨域问题就迎刃而解了

    最后你的nginx配置有些问题,具体可以参考如下http块的配置

    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        #include /etc/nginx/conf.d/*.conf;
    
        upstream gateway {
                     server 172.30.0.81;
                     server 172.30.0.82;
                     server 172.30.0.83;
                 }
    
    
        server {
          listen       8000;
          server_name  web;
          root         /usr/share/nginx/html;
    
          location / {
    
          }
    
          location ^~ /oauth/redirect {
               rewrite ^(.*)$ /index.html break;
          }
    
          location ^~ /api {
               proxy_set_header Host $host;
               proxy_set_header X-Real-IP $remote_addr;
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
               proxy_buffering off;
               rewrite ^/api/(.*)$ /$1 break;
               proxy_pass http://gateway;
          }
        }
    
    
    }


    0 讨论(0)
提交回复