Nginx解决跨域问题的案例演示

server/2024/11/25 2:23:07/

介绍跨域问题前,首先了解浏览器的同源策略(Same-Origin Policy)

同源策略

同源策略是一种浏览器安全机制,限制了从一个源加载的文档或脚本与另一个源的资源进行交互的能力。

同源的定义

如果两个URL的协议、域名(IP)、端口号均相同,则它们是同源的,否则是跨源的。举例如下:

# http和https协议不同, 不满足同源
http://192.168.1.2/user/1
https://192.168.1.2/user/1# IP不同,不满足同源
http://192.168.1.2/user/1
http://192.168.1.3/user/1# 域名不同,不满足同源
http://www.zhangsan.com/user/1
http://www.lisi.com/user/1# 端口不同,不满足同源
http://192.168.1.2/user/1
http://192.168.1.2:8080/user/1# 协议、域名、端口均相同,满足同源, 默认端口就是80
http://www.zhangsan:80/user/1
http://www.zhangsan/user/1

同源策略的必要性

避免跨站点脚本攻击,防止恶意网站读取另一个网站的敏感数据,保护用户数据安全

跨域问题演示

有两台服务器A,B,A和B不满足同源策略。如果从A的页面发送异步请求到B获取数据,就会出现跨域问题。演示如下:

1、创建一台虚拟机, 用Nginx启动两个服务器,如下:

  • 服务器A: http://192.168.52.200:80/a.html 页面上添加一个Button, 用户点击Button后发送异步请求到服务器B获取数据
  • 服务器B: http://192.168.52.200:8080/user 返回一个JSON数据, 值为{“id”: 1, “name”: “peter”, “age: 28”}

2、添加服务器A的页面a.html, 编辑/var/www/server_a/a.html,内容如下:

<html><head><meta charset="utf-8"><script src="jquery-3.7.1.min.js"></script><script>$(function(){$("#btn").click(function(){$.get('http://192.168.52.200:8080/user', function(data){alert(JSON.stringify(data));});});});</script></head><body><input type="button" value="Click Me, Get Data!" id="btn"/></body>
</html>

3、修改Nginx.conf,添加两个服务器的配置

    # 服务器Aserver {listen       80;server_name  _;access_log   access.log;include /etc/nginx/default.d/*.conf;location / {root /var/www/server_a;}error_page 500 502 503 504 /50x.html;location = /50x.html {}}# 服务器Bserver {listen       8080;server_name  _;access_log   access.log;include /etc/nginx/default.d/*.conf;# 返回简单的JSON数据,用于演示location /user {default_type application/json;return 200 '{"id":1, "name":"peter","age":28}';}error_page 500 502 503 504 /50x.html;location = /50x.html {}}

4.重新加载Nginx并启动, 访问192.168.52.200/a.html,点击Button, 发现没有显示JSON数据,请求失败。浏览器按F12查到如下报错:

Access to XMLHttpRequest at 'http://192.168.52.200:8080/user' 
from origin 'http://192.168.52.200' has been blocked by CORS policy: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

这就是跨域问题。你在浏览器中直接访问http://192.168.52.200:8080/user,是可以返回数据的

http://192.168.52.200:8080/user
{"id":1, "name":"peter","age":28}

使用Nginx解决跨域问题

跨域问题涉及的几个响应头

  • Access-Control-Allow-Origin 指定允许访问的源,可以配置多个,用逗号分隔, 也可以用*代表所有源
  • Access-Control-Allow-Methods 指定允许的HTTP方法,值可以为GET POST PUT DELETE,用逗号分隔

动手实现
修改Nginx.conf, 使用add_header指令添加Header,如下:

    server {listen       8080;server_name  _;access_log   access.log;include /etc/nginx/default.d/*.conf;location /user {# 添加Header, 允许源地址为192.168.52.200的GET,POST请求add_header Access-Control-Allow-Origin http://192.168.52.200;	# add_header Access-Control-Allow-Origin *; #允许所有地址跨域访问add_header Access-Control-Allow-Methods GET,POST;default_type application/json;return 200 '{"id":1, "name":"peter","age":28}';}}

重新加载Nginx, 访问192.168.52.200/a.html,点击Button,发现请求成功。

参考

https://www.cnblogs.com/javastack/p/16065851.html
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS


http://www.ppmy.cn/server/144683.html

相关文章

libphone desktop编译

linphone-desktop 在ubuntu20.04 下编译 linphone 介绍 Linphone是一款遵循GPL的开源网络视频电话系统&#xff0c;支持多种平台如Windows、Linux、Android等。它基于SIP协议&#xff0c;提供语音、视频通话及即时文本消息功能。核心功能包括SIP用户代理、音频视频Codec支持、…

经验笔记:Git 中的远程仓库链接及上下游关系管理

Git 中的远程仓库链接及上下游关系管理 1. 远程仓库的链接信息 当你克隆一个远程仓库时&#xff0c;Git 会在本地仓库中记录远程仓库的信息。这些信息包括远程仓库的 URL、默认的远程名称&#xff08;通常是 origin&#xff09;&#xff0c;以及远程仓库中的所有分支和标签。…

解决 Git 默认分支不一致问题:最佳实践与解决方案20241120

解决 Git 默认分支不一致问题&#xff1a;最佳实践与解决方案 在现代开发工作流中&#xff0c;Git 是一款不可或缺的代码版本管理工具&#xff0c;尤其是结合 GitHub、Gitee 等平台的远程仓库进行协作时。最近&#xff0c;我在使用 macOS 作为开发环境时遇到了一个经典但容易忽…

网络安全与加密

1.Base64简单说明描述&#xff1a;Base64可以成为密码学的基石&#xff0c;非常重要。特点&#xff1a;可以将任意的二进制数据进行Base64编码结果&#xff1a;所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符&#xff1a;A~Z a~z 0~9 / 对文件进行base64编码…

数学建模学习(138):基于 Python 的 AdaBoost 分类模型

1. AdaBoost算法简介 AdaBoost(Adaptive Boosting)是一种经典的集成学习算法,由Yoav Freund和Robert Schapire提出。它通过迭代训练一系列的弱分类器,并将这些弱分类器组合成一个强分类器。算法的核心思想是:对于被错误分类的样本,在下一轮训练中增加其权重;对于正确分类…

C# 程序,内存会被占满的问题,尝试清理下内存吧

引用个动态库 [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint "SetProcessWorkingSetSize", ExactSpelling true, CharSet System.Runtime.InteropServices.CharSet.Ansi, SetLastError true)]private static extern…

c#:winform引入bartender

1、vs新建项目 ①选择Windows窗体应用&#xff08;.NET Framework&#xff09; 2、将bartender引入vs中 ①找到bartender的安装目录&#xff0c;复制Seagull.BarTender.Print.dll文件 ②粘贴到项目->bin->Debug文件&#xff0c;并可创建Model文件夹&#xff1a;为了存放…

《Django 5 By Example》阅读笔记:p679-p765

《Django 5 By Example》学习第10天&#xff0c;p679-p765总结&#xff0c;总计87页。 一、技术总结 1.channel 书里通过聊天软件功能演示Django中channel以及异步编程的应用&#xff0c;本人对这块不是很熟悉&#xff0c;不做评价。 2.deployment(部署) services:db:imag…