CORS解决跨域问题(Nginx跨域配置)

article/2025/9/19 9:20:20

背景:

同域:域名(父域名和子域名都相同),端口,协议都相同

跨域:非同域的请求

 

问题:

浏览器上,我们访问127.0.0.1:80,但是127.0.0.1:80 会去请求127.0.0.1:81的数据(比如js文件,ajax请求等),此时80访问81会出现跨域问题,但我们浏览器能直接访问81的数据

 

注意:

跨域不是请求发不出去,而是服务端正常返回结果后被浏览器拦截返回结果。(浏览器为了防止非同源的请求 拿到服务器的返回数据结果)

 

解决办法:

跨域有2种请求,浏览器对于2种请求的处理不一样

简单请求:

请求方法只能是:HEAD,GET,POST

主动设置的头信息不能超过以下字段Accept,Accept-Language,Content-Language,Last-Event-ID,Content-Type(只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)

注意:这里的头信息是指我们主动设置的头部信息,在查看请求过程时会发现 浏览器会在头信息里设置Origin等信息,这些不算主动设置的。

非简单请求:不能同时满足简单请求的2个条件

 

 

简单请求:

浏览器会在 请求头信息 里增加一个Origin字段,表明本次请求的来源,若服务器返回的头部信息里需包含 Access-Control-Allow-Origin并包含Origin 则浏览器正常返回数据,否则出现跨域错误。

如果需要携带cookie,请求时需设置(比如XMLHttpRequest.withCredentials = true)。若返回头部信息有 Access-Control-Allow-Credentials:true,则浏览器会正常返回数据,否则浏览器会拦截结果报 跨域错误。

注意:服务器会正常返回数据,只是浏览器拦截了结果。

服务器在返回头信息里设置必须):

Access-Control-Allow-Origin: Origin       

Eg:Access-Control-Allow-Origin:127.0.0.1:80

如果想设置匹配所有的Origin且不带cookie的,可以设置:

Access-Control-Allow-Origin: *

如果需要带Cookie,需设置:

Access-Control-Allow-Credentials:true

如果想匹配所有的Origin且带cookie:

Access-Control-Allow-Credentials: true

Access-Control-Allow-Origin: 请求的Origin(从request获取后填入)

千万不能同时设置Credentials=true且Origin=*,浏览器会报错:

has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute

例如服务器nginx配置案例:

add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Origin $http_origin;

 

非简单请求:

常见的情况请求方法是PUT  或者  Content-Type字段类型是application/json 或者   头信息里自定义了属性

过程:

此时浏览器将请求分成2步:预检请求   +  简单请求

预检请求:真正请求前增加一次预检(preflight)请求(请求方法是OPTIONS),浏览器进行校验,如果返回状态码是2XX表示验证通过

简单请求:预检通过后,发送简单请求到服务器(浏览器校验Access-Control-Allow-Origin和Origin是否匹配 +  Access-Control-Allow-Credentials 和 需要携带Cookie 相匹配 )。

 

预检校验:

请求方法:OPTIONS

Header里增加:

Access-Control-Request-Headers(若单独设置了header,比如 resource:tom)

Access-Control-Request-Method:GET(例如真正的请求的请求方式是GET)

Origin:请求的域

 

浏览器通过和Response里的相对应的内容进行对比(例如返回PUT,DELETE,请求的是PUT,则校验通过)

返回的Methods默认是包括 简单请求 里的HEAD,POST,GET请求的(所以返回的里面填入*,也只能匹配到HEAD GET POST,不能匹配PUT等)

返回的Headers默认是包括 简单请求 里的几个字段

千万注意:返回里面设置Methods 或者 Headers为 * 不是代表匹配到任意的内容

注:

预检请求返回时,服务器可以额外配置Access-Control-Max-Age:xxx(单位秒),表示在此时间内请求不再发出另一条预检请求。

 

例如服务器nginx里配置跨域(针对OPTIONS请求直接返回2XX):

location /file {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin $http_origin;add_header Access-Control-Allow-Methods $http_access_control_request_method;add_header Access-Control-Allow-Credentials true;add_header Access-Control-Allow-Headers $http_access_control_request_method;add_header Access-Control-Max-Age 1728000;return 204;}


 

后记:

同源策略是浏览器保护用户的措施,防止第三方网站请求拿到返回的数据(比如cookie和请求的返回结果)。

针对现在前后端分离,一般会在 后端/nginx 设置仅允许 前端的IP/域名 才能跨域请求拿到结果。

 

 

 

nginx里完整的跨域配置:

     server {listen  80 default_server;server_name _;  add_header Access-Control-Allow-Credentials true;add_header Access-Control-Allow-Origin $http_origin;location /file {if ($request_method = 'OPTIONS') {add_header Access-Control-Allow-Origin $http_origin;add_header Access-Control-Allow-Methods $http_access_control_request_method;add_header Access-Control-Allow-Credentials true;add_header Access-Control-Allow-Headers $http_access_control_request_headers;add_header Access-Control-Max-Age 1728000;return 204;}         }}


 Spring里跨域配置:

@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();final CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true); //支持cookie 跨域config.setAllowedOrigins(Arrays.asList("*"));config.setAllowedHeaders(Arrays.asList("*"));config.setAllowedMethods(Arrays.asList("*"));config.setMaxAge(300L);//设置时间有效source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}
}

 

注:这里设置AllowCredentials为*没问题,是因为程序里做了处理(在CorsConfiguration类里):

 

参考:http://www.ruanyifeng.com/blog/2016/04/cors.html

前端跨域测试:https://blog.csdn.net/qq_35720307/article/details/83616682


http://chatgpt.dhexx.cn/article/UbHUQDvB.shtml

相关文章

Nginx配置反向代理解决跨域问题

通过Nginx配置反向代理结果跨域问题 第一步:下载Nginx 一、下载 官网下载地址:http://nginx.org/en/download.html 我下载的版本:http://nginx.org/download/nginx-1.15.2.zip (我也是参考网上的步骤,所以下载的不是…

Nginx配置跨域及解析

一、代码 先放上nginx配置代码 # 以代理百度地图api为例location /mymap/ {proxy_pass http://api.map.baidu.com/;# 配置跨域代理 add_header Access-Control-Allow-Origin $http_origin;add_header Access-Control-Allow-Methods GET,POST,OPTIONS…

nginx配置详解,nginx跨域问题

文章目录 前言更改hosts文件新增velocityerp.top.conf配置文件nginx配置header参数(解决跨域),接口方配置nginx反向代理(解决跨域),发送方配置nginx端口转发(解决跨域)nginx内部跳转nginx配置优先级详解 前言 本文介绍…

nginx 配置支持跨域

在nginx.conf文件内,server中加入以下内容 #允许跨域请求的域,*代表所有 add_header Access-Control-Allow-Origin *; #允许带上cookie请求 add_header Access-Control-Allow-Credentials true; #允许请求的方法,比如 GET/POST/PUT/DELETE a…

通过Nginx来解决跨域问题

Nginx跨域实现 首先大家要搞清楚什么是跨域,为什么会有跨域情况的出现。哪些情况属于跨域? 跨域:由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容 注:同源策略,单说来就是同协议&a…

Nginx 解决跨域

项目准备 前端网站地址:http://localhost:8080 服务端网址:http://localhost:8081 确认服务端是没有处理跨域的,先用postman测试服务端接口是正常的 当前端网站8080去访问服务端接口时,就产生了跨域问题,那么如何解…

1 Nginx跨域配置

跨域问题在之前的单体架构开发中,其实是比较少见的问题,除非是需要接入第三方SDK时,才需要处理此问题。但随着现在前后端分离、分布式架构的流行,跨域问题也成为了每个Java开发必须要懂得解决的一个问题。 跨域问题产生的原因 产…

Nginx跨域配置

随着越来越多的项目走向了前后端分离,前端服务,需要访问到不同的后端地址,经常遇到跨域问题。本文主要介绍使用Nginx解决跨域问题。 1.什么是跨域 由于浏览器的同源策略,用来限制从一个源加载的文档或脚本与来自另一个源的资源进…

flyai中的dataset对象

Help on Dataset in module flyai.dataset object:class Dataset(builtins.object) | Methods defined here: | | __init__(self, epochs5, batch32, val_batch32) | :param epochs: 训练的轮次,最大不超过100 | :param batch: 训练的批次大小&#xff…

FlyAI资讯:Uber正式开源分布式机器学习平台:Fiber

摘要:在过去的几年中,计算机不断增强的处理能力推动了机器学习的进步。算法越来越多地利用并行性,并依赖分布式训练来处理大量数据。然而,随之而来的是增加数据和训练的需求,这对管理和利用大规模计算资源的软件提出了…

FlyAI小课堂:Python机器学习笔记:Logistic Regression

Logistic回归公式推导和代码实现 1,引言 logistic回归是机器学习中最常用最经典的分类方法之一,有人称之为逻辑回归或者逻辑斯蒂回归。虽然他称为回归模型,但是却处理的是分类问题,这主要是因为它的本质是一个线性模型加上一个映…

FlyAI竞赛:图片颜值打分趣味赛

人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的…

FlyAI小课堂:Tensorflow-分布式训练

人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的…

FlyAI小课堂:【文本分类-中文】textRNN

摘要: 随着深度学习的快速发展,人们创建了一整套神经网络结构来解决各种各样的任务和问题。在英文分类基础上,中文文本分类的处理也同样重要... 人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛&#x…

FlyAI小课堂:【文本分类-中文】textCNN

摘要: 随着深度学习的快速发展,人们创建了一整套神经网络结构来解决各种各样的任务和问题。在英文分类基础上,中文文本分类的处理也同样重要... 人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛&#x…

FlyAI人工智能社区参赛指南—用户体验版

Fly-AI竞赛服务平台 flyai.com 在开始学习之前推荐大家可以多在 FlyAI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以…

FlyAI资讯:GPT-3的威力,助力AI领域

摘要:大概一个月之前,史上最巨无霸NLP模型GPT-3问世。当时它向世界展示的能力是,“不仅会写短文,而且写出来的作文挺逼真的,几乎可以骗过人类,可以说几乎通过了图灵测试。”可能是因为它的前一代模型GPT-2也…

FlyAI赛题预告:时间序列初学者指南

近期,FlyAI服务竞赛平台将上线时间序列相关赛题,看到此文的童鞋们可以多多关注下;推荐大家可以多在FlyAI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。…

FlyAI资讯:人工智能的前世今生

摘要: 现代电子产品和设备在诸如通信 、娱乐 、安全和医疗保健等许多方面改善了我们的生活质量 ,这主要是因为现代微电子技术的发展极大地改变了人们的日常工作和互动方式。在过去几十年中,摩尔定律一直是通过不断缩小芯 … 人工智能学习离不开实践的验…

FlyAI小课堂:Tensorflow基操

人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的…