Nginx解决跨域访问难题:轻松实现跨域资源共享!

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~

跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种网络浏览器的安全功能,它限制了一个源(域、协议和端口的三元组)的web页面向另一个源请求资源。这可以防止恶意内容执行跨站请求伪造(CSRF)攻击。然而,在开发过程中,特别是在前后端分离的应用中,我们通常需要允许跨域请求。

1

跨域问题演示

ca5da30959637344e7c2010bcc6ce910.png

1、什么是跨域访问

如果2个服务器节点的协议,域名,端口有一个不同,那么这2台服务器之间互相访问就会出现跨域访问的问题,跨域限制的根本原因是浏览器的限制,浏览器为了安全从而限制跨域访问。

2、跨域示例说明

演示一:

假设Tomcat2服务器部署了一个hello.json文件,里面是一个json格式的数据,用它来模拟跨域访问问题。

hello.json内容如下:

{
"hello":"world"
}

Tomcat1服务器上的index.jsp通过一段js代码要获取到Tomcat2服务器上的hello.json内容,并通过alert输出key=hello的值world。

在Tomcat1服务器的ROOT下上传jquery-2.1.1.min.js文件,在index.jsp文件的head中增加如下代码:

<script src="jquery-2.1.1.min.js"></script>
<script>
$(function(){
$.get("http://192.168.1.10:8080/hello.json",{},function(result){
alert(result.hello);
});            
});
</script>

如下图:

8f2be74da6e72780d4eaec50a47e5d44.png

通过浏览器输入http://192.168.1.9:8080,提示“Failed to load http://192.168.1.10:8080/hello.json: No 'Access-Control-Allow-Origin' ”,说明出现了跨域访问问题

72c186bda8dc0124462e983cc575d04d.jpeg

演示二

如果我们在Tomcat1的index.jsp里通过Nginx代理获取Tomcat2服务器的hello.json文件,是否可行呢?

  1. 修改/data/program/tomcat8/webapps/ROOT目录下的index.jsp文件,把IP地址改为Nginx代理的地址

    <script src="jquery-2.1.1.min.js"></script>
    <script>
            $(function(){
                    $.get("http://192.168.1.8/hello.json",{},function(result){
                            alert(result.hello);
                    });            
            });
    </script>
  2. 修改/data/program/nginx/conf/userconf目录下的proxy.conf配置,注释掉对192.168.1.9:8080的反向代理,为了演示,让其只代理192.168.1.10:8080。

    upstream tomcat8 {
       #server 192.168.1.9:8080;
        server 192.168.1.10:8080;
    }
    
    server{
        listen 80;
        server_name localhostdomin;
        location / {
            proxy_pass http://tomcat8;
        }
        location ~* .+\.(js|css|png|svg|ico|jpg)$ {
            root static_resource;
            expires 1d;
        }
    }
  3. 重启Nginx服务器,通过浏览器输入http://192.168.1.9:8080,提示“Failed to load http://192.168.1.8/hello.json: No 'Access-Control-Allow-Origin'”,说明依然存在跨域访问问题。

2

Nginx解决跨域请求问题

ad0967a4cc5c6e109b4825011874db75.png

通过nginx的配置解决以上出现的跨域问题

再次修改/data/program/nginx/conf/userconf目录下的proxy.conf配置,通过add_header设置解决跨域访问问题

upstream tomcat8 {
   #server 192.168.1.9:8080;
    server 192.168.1.10:8080;
}

server{
    listen 80;
    server_name localhostdomin;
    location / {
        proxy_pass http://tomcat8;
        add_header 'Access-Control-Allow-Origin' '*';                
        add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE';
        add_header 'Access-Control-Allow-Header' 'Content-Type,*';
    }
    location ~* .+\.(js|css|png|svg|ico|jpg)$ {
        root static_resource;
        expires 1d;
    }
}

如下图:

546cbe58f5956fc6ff4f126ab0012536.png

保存配置,并重启Nginx服务器

通过浏览器输入http://192.168.1.9:8080,可以弹出world的值,如下:

74583acf4d23077c167918da7bd2abb2.jpeg

因此,说明通过nginx的配置,我们解决了上面的跨域访问问题,可以正常获取到Tomcat2服务器上的json资源。

注:上面的网页没有样式,是因为之前我们把Tomcat里面的静态资源挪走导致的。

相关推荐

  1. 资源共享(CORS)问题与解决方案

    2024-04-21 12:56:01       28 阅读
  2. nginx 设置

    2024-04-21 12:56:01       42 阅读
  3. Nginx配置文件之实现

    2024-04-21 12:56:01       43 阅读
  4. 】同源策略、解决

    2024-04-21 12:56:01       56 阅读
  5. 解决方案

    2024-04-21 12:56:01       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 12:56:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 12:56:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 12:56:01       82 阅读
  4. Python语言-面向对象

    2024-04-21 12:56:01       91 阅读

热门阅读

  1. 如何实现redis的高可用?

    2024-04-21 12:56:01       30 阅读
  2. 浅谈-“指针”

    2024-04-21 12:56:01       32 阅读
  3. 2233: 【数学】因子游戏

    2024-04-21 12:56:01       36 阅读
  4. 【Redis(6)】Redis集群模式配置示例

    2024-04-21 12:56:01       39 阅读
  5. 设计模式|迭代器模式(Iterator)

    2024-04-21 12:56:01       37 阅读
  6. 微信小程序手机授权报错:pad block corrupted

    2024-04-21 12:56:01       114 阅读
  7. flutter知识点--PlatformView

    2024-04-21 12:56:01       39 阅读
  8. 2024年Getx教程_Flutter+Getx系列实战教程介绍

    2024-04-21 12:56:01       39 阅读