(nginx的方案源于网上资料,本文档仅供参考)

现象

nginx配置监听端口不是80(http协议)或443(https协议)时,登录smartbi后在界面上无法导出资源、系统日志,打开报表点导出按钮无法导出文件,也就是大部分下载的操作都不正常。

如下示例,配置http监听端口是8088,有问题的nginx.conf配置如下:

#user  root root;                                                                
worker_processes  1;                                                           
events {                                                                        
    worker_connections  1024;                                                   
}                                                                               
http {
	include  mime.types;
	default_type application/octet-stream;
	sendfile  on;
	keepalive_timeout 65;
	server {
    listen       8088;
    server_name  localhost 10.10.10.23;
    #charset koi8-r;
    
    resolver 8.8.8.8;
     location /smartbi/  {
            proxy_pass         http://10.10.202.17:18600/smartbi/ ;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            client_max_body_size 100m;
            client_body_buffer_size 128k;
            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;
        }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }   
	}
}

导出日志时浏览器并未下载文件,查看F12可以看到如下:

如果将8088端口改成80端口,保存重启nginx则可以正常导出日志。

解释

在smartbi中下载资源是会重定向的,当前的nginx配置没有正确的把端口信息告知浏览器导致重定向时用了http协议默认的80端口(http协议的url中不显示80)

解决方案

对于上述问题,有以下解决方案:

增加端口信息到proxy_set_header,将

proxy_set_header   Host             $host;改成

proxy_set_header   Host             $host:$server_port;


保存配置后重启nginx。


注意:如果nginx是通过docker之类的容器环境部署,并且nginx容器的内外端口不一致时,需要把$server_port 改为nginx对外的实际端口值