解决web服务中在线查看minio上文件提示CORS的问题

web页面访问excel、word之类的文件时,由于浏览器的安全机制,如果目标地址和源地址不同源,就会报CORS,即跨域访问的问题。

解决跨域的问题,主要有2个思路:
方案1修改目标服务的CORS策略,允许跨域访问
方案2强行同源,然后使用nginx转发请求。

此前使用s3服务的时候,使用方案1解决了跨域访问的问题。
s3服务,不管是客户端还是python sdk,都可以直接修改指定桶的CORS策略,
配置大致如下:

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedOrigin>http://your.webservice.com
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>

这次原本还想用这个办法,结果minio无论是控制台还是python sdk,都找不到修改指定桶CORS策略的入口,没办法了,只能朝着方案2努力。

以下是此次使用nginx转发请求的详细配置。
第一步修改目标地址,增加特殊前缀,以便nginx配置location
例如,目标地址是http://minio.service.com/bucket-name/object-name

给它改成http://**your.webService.com/minio/api**/bucket-name/object-name

注意看,我增加了your.webService.com/minio/api,这样你在自己的web服务访问这个地址的时候,首先不会有跨域的问题了,实际请求的是本地服务。minio/api前缀还有别的用途。
第二步:nginx上配置转发
nginx上增加配置:

# nginx.conf
upstream minioServer {
      server minio.service.com:9000;  
}
server {
    listen       80;
    server_name  _;
    ...
	location /minio/api {
		rewrite ^/minio/api(/.*)$ $1 break;
        proxy_pass http://minioServer;
		proxy_set_header Host minio.service.com;
		add_header 'Access-Control-Origin' 'http://your.webService.com' always;
		add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
    }
    ...
}

踩坑点:

1.server minio.service.com:9000 端口一定一定要带上,否则nginx默认转发的是80端口,那么请求就会响应404。
2.MinIO 使用请求头中的 Host 来判断是否是预签名 URL 请求,如果你的python sdk获取文件预签名的时候仅仅使用了minio服务的域名,没有带上端口,因为python sdk默认minio是部署在9000端口的,那proxy_set_header Host minio.service.com;这里就要重新修改Host,去掉端口,否则会提示SignatureDoesNotMatch

你可能感兴趣的:(前端,网络,javascript)