关于nginx:Nginx-指定多个域名跨域请求配置

2次阅读

共计 2270 个字符,预计需要花费 6 分钟才能阅读完成。

nginx 指定多个域名跨域申请配置

什么是跨域

假如咱们页面或者利用已在 http://www.test1.com 上了,而咱们打算从 http://www.test2.com 申请提取数据。个别状况下,如果咱们间接应用 AJAX 来申请将会失败,浏览器也会返回“源不匹配”的谬误,” 跨域 ” 也就以此由来。跨域的呈现次要起因还是平安的限度 (同源策略,也就是 JavaScript 或者 Cookie 只可能拜访同域下的内容),因而在日常的我的项目开发中会不可避免的呈现跨域操作。和打少数跨域的解决方案一样,JSONP 是大多数前端共事的抉择,然而 JSONP 只反对 GET 申请。然而如果我的项目性能须要改成反对 POST 申请, 那么因为这种状况下传输的数据量较大,GET 模式是搞不定的。此时 JSONP 并不是一个很好的抉择。此时就须要应用 CORS(跨域资源共享,Cross-Origin Resource Sharing).

个别跨域会呈现的问题

一般来说,跨域会呈现如下的问题:

理论我的项目中呈现的问题

先前配置中有如下的域名:

browser.in.meizu.com 是向客户端或者是 H5 提供接口拜访的后盾域名,browser-res.in.meizu.com,v-res.in.meizu.com 都是提供给 h5 端的入口拜访域名。先前在 nginx 中有如下的配置:

如果设置了这个配置,那么如果前端的入口是 browser-res.in.meizu.com, 那么它是能够拜访到 browser.in.meizu.com 提供的接口的。前端同学用了 v -res.in.meizu.com 这个域名作为 h5 端拜访入口,拜访 browser.in.meizu.com,因为此时 nginx 并没有相干的配置,因而呈现了如下的问题:

很显著, 这个问题并不是说原程序没有设置 ”add_header Access-Control-Allow-Origin:”。咱们看后面的 nginx 中的 配置,曾经设置了 browser-res.in.meizu.com 能够拜访 browser.in.meizu.com。然而当初的一个问题是前端的同 学应用了 “v-res.in.meizu.com” 这个域名作为前端的入口, 所以就呈现了以上的问题:browser-res.in.meizu.com 是 能够拜访 browser.in.meizu.com。然而 v -res.in.meizu.com 不能够拜访 browser.in.meizu.com. 然而过后思考问题只是 认为是简略的跨域问题, 没有思考到在 nginx 中的配置, 所以就简略的应用了过滤器来进行解决.

/**

  • 跨域拜访时容许对服务端提交申请过滤器
  • @author liguo
  • @date 2017-12-31

*

*/

public class CrossDomainFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

// 跨域拜访转换

HttpServletResponse httpResponse = (HttpServletResponse) response;

httpResponse.setHeader(“Access-Control-Allow-Origin”,”*”);

chain.doFilter(request, response);

}

/*

  • (non-Javadoc)
  • @see javax.servlet.Filter#destroy()

*/

@Override

public void destroy() {

}

}

而后在 web.xml 中配置这个过滤器。尝试应用过滤器来解决这个问题,在本地联调时没有呈现问题。起初部署到测试环境后,呈现了以下的问题:

这是因为在本地没有跑 nginx, 然而部署到测试环境当前,跑了 nginx, 而 nginx 中曾经有了相干的配置,因而呈现了以上的问题。

如何解决这个问题

办法一

先前 nginx 中有以下的配置:

将 add_header Access-Control-Allow-Origin:http://browser-res.in.meizu.c… Access-Control-Allow-Origin *, 也就是批改为如下的内容:

这个配置的意思是说,任何的域名都能够拜访 browser.in.meizu.com, 然而这个配置不平安

办法二

通过设置变量值解决指定多个域名白名单跨域申请配置(倡议应用 ), 也就是将 nginx 中的配置改为如下的模式

也就是设置一个变量 $cors_origin 来存储须要跨域的白名单,通过正则判断,若是白名单列表,则设置 $cors_origin 值为对应的域名,则做到了多域名跨域白名单性能。

综述

当跨域问题呈现时,个别状况下在 nginx 中通过配置来解决,如果是多个域,那么能够通过设置变量值解决指定多个域名白名单跨域申请配置(倡议应用).

更多 Linux 服务器开发底层原理知识点:Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,线程池,Docker,TCP/IP,协程,DPDK,Linux 内核内容。+qun720209036 获取

正文完
 0