【Nginx】还不会使用Nginx解决跨域问题?肝这一篇就够了!!

开发 项目管理
前端为H5项目,后端为Java、PHP、Python等项目。而且大部分后端服务并不会只部署一套服务,而是会采用Nginx对后端服务进行负载均衡。

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:https://github.com/sunshinelyz/mykit-delay

写在前面

当今互联网行业,大部分Web项目基本都是采用的前后端分离模式。前端为H5项目,后端为Java、PHP、Python等项目。而且大部分后端服务并不会只部署一套服务,而是会采用Nginx对后端服务进行负载均衡。那么,此时就会出现一个问题了:如果一个请求url的 协议、域名、端口 三者之间任意一个与当前页面url不同就会产生跨域的现象。那么如何使用Nginx解决跨域问题呢?接下来,我们就一起探讨下这个问题。

为何会跨域?

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。

Nginx如何解决跨域?

这里,我们利用Nginx的反向代理功能解决跨域问题,至于,什么是Nginx的反向代理,大家就请自行百度或者谷歌吧。

Nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上。通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。对于浏览器来说,访问的就是同源服务器上的一个url。而Nginx通过检测url前缀,把http请求转发到后面真实的物理服务器。并通过rewrite命令把前缀再去掉。这样真实的服务器就可以正确处理请求,并且并不知道这个请求是来自代理服务器的。

Nginx解决跨域案例

使用Nginx解决跨域问题时,我们可以编译Nginx的nginx.conf配置文件,例如,将nginx.conf文件的server节点的内容编辑成如下所示。

  1. server { 
  2.         location / { 
  3.             root   html; 
  4.             index  index.html index.htm; 
  5.             //允许cros跨域访问 
  6.             add_header 'Access-Control-Allow-Origin' '*'
  7.  
  8.         } 
  9.         //自定义本地路径 
  10.         location /apis { 
  11.             rewrite  ^.+apis/?(.*)$ /$1 break; 
  12.             include  uwsgi_params; 
  13.             proxy_pass   http://www.binghe.com; 
  14.        } 

然后我把项目部署在nginx的html根目录下,在ajax调用时设置url从http://www.binghe.com/apistest/test 变为 http://www.binghe.com/apis/apistest/test然后成功解决。

假设,之前我在页面上发起的Ajax请求如下所示。

  1. $.ajax({ 
  2.         type:"post"
  3.         dataType: "json"
  4.         data:{'parameter':JSON.stringify(data)}, 
  5.         url:"http://www.binghe.com/apistest/test"
  6.         async: flag, 
  7.         beforeSend: function (xhr) { 
  8.  
  9.             xhr.setRequestHeader("Content-Type", submitType.Content_Type); 
  10.             xhr.setRequestHeader("user-id", submitType.user_id); 
  11.             xhr.setRequestHeader("role-type", submitType.role_type); 
  12.             xhr.setRequestHeader("access-token", getAccessToken().token); 
  13.         }, 
  14.         success:function(result, status, xhr){ 
  15.  
  16.         } 
  17.         ,error:function (e) { 
  18.             layerMsg('请求失败,请稍后再试'
  19.         } 
  20.     }); 

修改成如下的请求即可解决跨域问题。

  1. $.ajax({ 
  2.         type:"post"
  3.         dataType: "json"
  4.         data:{'parameter':JSON.stringify(data)}, 
  5.         url:"http:www.binghe.com/apis/apistest/test"
  6.         async: flag, 
  7.         beforeSend: function (xhr) { 
  8.  
  9.             xhr.setRequestHeader("Content-Type", submitType.Content_Type); 
  10.             xhr.setRequestHeader("user-id", submitType.user_id); 
  11.             xhr.setRequestHeader("role-type", submitType.role_type); 
  12.             xhr.setRequestHeader("access-token", getAccessToken().token); 
  13.         }, 
  14.         success:function(result, status, xhr){ 
  15.  
  16.         } 
  17.         ,error:function (e) { 
  18.             layerMsg('请求失败,请稍后再试'
  19.         } 
  20.     }); 

本文转载自微信公众号「冰河技术」,可以通过以下二维码关注。转载本文请联系冰河技术公众号。

 

责任编辑:武晓燕 来源: 冰河技术
相关推荐

2020-11-06 10:01:06

Nginx

2018-11-12 08:07:04

Nginx优化并发

2020-09-22 17:31:13

运维架构技术

2020-08-03 10:00:11

前端登录服务器

2023-04-24 08:00:00

ES集群容器

2019-04-01 10:43:59

Linux问题故障

2017-09-19 14:36:34

机器学习

2017-10-04 06:36:55

机器学习python数据

2020-02-18 16:20:03

Redis ANSI C语言日志型

2023-02-10 09:04:27

2022-06-20 09:01:23

Git插件项目

2020-05-14 16:35:21

Kubernetes网络策略DNS

2019-12-31 09:56:16

Linux 系统 数据

2020-07-03 08:21:57

Java集合框架

2023-10-17 08:15:28

API前后端分离

2019-05-14 09:31:16

架构整洁软件编程范式

2024-04-08 10:01:33

2021-05-14 23:31:50

大数据计算机开发

2018-05-22 08:24:50

PythonPyMongoMongoDB

2017-09-18 20:07:56

数据科学机器学习python
点赞
收藏

51CTO技术栈公众号