Nginx使用经验之支持跨域

使用背景

之前在公司搭建了一台fastdfs文件服务器,使用一直正常。但某天一个前端同事反馈,使用中遇到个问题:
他用一个插件获取文件服务器上的文件,却报了异常–Access to fetch at 'http://ip:port/xx/M00/00/00/abc.pdf' from origin 'null' has been blocked by CORS policy: request's mode to 'no-cors' to fetch the resource with CORS disabled.
显然,异常表明这是文件服务器上的nginx不支持跨域访问导致的。尽管其它前端应用在跨域访问文服上的文件时都是正常的,但本着尊重异常提示的原则,仍然尝试在我这边的nginx上去解决掉此问题

解决方案

在代理的location上增加一段支持跨域的配置,如下:

location /xx/M00/ {
	#新增的配置,用以支持跨域访问
	add_header 'Access-Control-Allow-Origin' $http_origin;
	add_header 'Access-Control-Allow-Credentials' 'true';
	add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
	add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-	token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
	add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
	if ($request_method = 'OPTIONS') {
		add_header 'Access-Control-Max-Age' 1728000;
		add_header 'Content-Type' 'text/plain; charset=utf-8';
		add_header 'Content-Length' 0;
		return 204;
	}
	#原来的配置
	proxy_pass http://31.48.120.21:8888/xx/M00/;
	proxy_redirect default;
}

大致解释一下:

  • Access-Control-Allow-Origin,指定允许其他域名访问,这里使用变量 $http_origin取得当前来源域
  • Access-Control-Allow-Credentials,是否允许后续请求携带认证信息(cookies)
  • Access-Control-Allow-Methods,OPTIONS一定要有的,另外一般也就GET和POST,如果你有其它的也可加进去
  • Access-Control-Allow-Headers,这个要注意,里面一定要包含自定义的http头字段(就是说前端请求接口时,如果在http头里加了自定义的字段,这里配置一定要写上相应的字段)
  • Access-Control-Expose-Headers,可不设置,看网上大致意思是默认只能获取返回头的6个基本字段,要获取其它额外的,先在这设置才能获取它
  • 语句“ if ($request_method = 'OPTIONS') {}”,这是关键。因为浏览器判断是否允许跨域时会先往后端发一个 options
    请求,然后根据返回的结果判断是否允许跨域请求,所以这里单独判断这个请求,然后直接返回204(204指成功但无需跳转);

经验证,该配置成功解决掉上述问题

参考文章

https://blog.youkuaiyun.com/envon123/article/details/83270277

在Unity游戏引擎中,为了支持Web请求(例如通过WWW类)与外部服务器进行数据交互,特别是在处理资源共享(Cross-Origin Resource Sharing, CORS)时,可以利用Nginx作为反向代理服务器,同时结合jar包来处理问题。 步骤如下: 1. **设置Nginx**: - Nginx需要配置允许特定访问的游戏服务器资源。在Nginx的配置文件(通常是`nginx.conf`)中,创建一个新的location块,允许来自指定源(如`http://game-api.example.com`)的请求。 ```nginx location /game-data { add_header 'Access-Control-Allow-Origin' '*'; // 允许所有来源 add_header 'Access-Control-Allow-Methods' 'GET, POST'; add_header 'Access-Control-Allow-Headers' 'Content-Type'; proxy_pass http://your-game-server:8080; // 代理到Unity服务器端口 } ``` 2. **打包jar包**: - 如果你的Unity项目使用了Java后端服务,可以将CORS相关的库(比如`java.net.http`或第三方库如`spring-cors`)打包成jar文件,并部署在服务器上。 - 创建一个Java servlet或者RESTful API,在响应头中添加CORS策略,与Nginx配置相匹配。 3. **Unity客户端**: - 使用Unity的WWW类发送网络请求时,先构建一个指向Nginx地址的URL,而不是直接目标服务器地址。 ```csharp WWW www = new WWW("http://your-nginx-proxy.com/game-data/api/endpoint"); ``` 这样,Unity客户端就可以安全地通过Nginx进行请求,而Nginx作为中间层,负责转发请求并管理策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值