通过Nginx来解决跨域问题

article/2025/9/19 10:07:14

Nginx跨域实现

  首先大家要搞清楚什么是跨域,为什么会有跨域情况的出现。哪些情况属于跨域?

跨域:由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容 :同源策略,单说来就是同协议,同域名,同端口

URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许 http://www.a.com:8000/a.js http://www.a.com/b.js 同一域名,不同端口 不允许 http://www.a.com/a.js https://www.a.com/b.js 同一域名,不同协议 不允许 http://www.a.com/a.js http://70.32.92.74/b.js 域名和域名对应ip 不允许 http://www.a.com/a.js http://script.a.com/b.js 主域相同,子域不同 不允许 http://www.a.com/a.js http://a.com/b.js 同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问) http://www.cnblogs.com/a.js http://www.a.com/b.js 不同域名 不允许

跨域场景

  出于安全考虑(比如csrf攻击),浏览器一般会禁止进行跨域访问,但是因为有时有相应需求,需要允许跨域访问,这时,我们就需要将跨域访问限制打开。  启动一个web服务,端口是8081   然后再开启一个web服务/前端服务都可以。端口是8082,然后再8082的服务中通过ajax来访问8081的服务,这就不满足同源策略,就会出现跨域问题

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><html><head>    <meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><h2>Hello World!</h2><script type="text/javascript">    function fun1(){        var request = new XMLHttpRequest();        request.open("GET","http://localhost:8081/user/query")        request.send();        request.onreadystatechange = function(){            if(request.status==200 && request.readyState == 4){                console.log("响应的结果" + request.responseText)            }        }    }</script></body>    <input type="button" value="跨域调用" onclick="fun1()"></html>

跨域问题的解决方案

  解决跨域问题的方式也有多种。

1、前后端结合(JsonP)

  虽然jsonp也可以实现跨域,但是因为jsonp不支持post请求,应用场景受到很大限制,所以这里不对jsonp作介绍。

2、纯后端方式一(CORS方式)

  CORS 是w3c标准的方式,通过在web服务器端设置:响应头Access-Cntrol-Alow-Origin 来指定哪些域可以访问本域的数据,ie8&9(XDomainRequest),10+,chrom4,firefox3.5,safair4,opera12支持这种方式。

  服务器代理,同源策略只存在浏览器端,通过服务器转发请求可以达到跨域请求的目的,劣势:增加服务器的负担,且访问速度慢。

3.纯后端方式二(Nginx代理方式)【建议这种方式】

  首先配置Nginx的反向代理方式 

代理访问正常 

8082的服务访问Nginx,出现了跨域问题

Nginx配置跨域解决


location / {  add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';if ($request_method = 'OPTIONS') {return 204;
}
proxy_pass http://192.168.12.1:8081;
}

解决了跨域问题 

参数说明

Access-Control-Allow-Origin

  服务器默认是不被允许跨域的。给Nginx服务器配置Access-Control-Allow-Origin *后,表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。

Access-Control-Allow-Headers

  是为了防止出现以下错误:

Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

  这个错误表示当前请求Content-Type的值不被支持。其实是我们发起了"application/json"的类型请求导致的。这里涉及到一个概念:预检请求(preflight request),请看下面"预检请求"的介绍。

Access-Control-Allow-Methods

  是为了防止出现以下错误:

Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

给OPTIONS 添加 204的返回

  是为了处理在发送POST请求时Nginx依然拒绝访问的错误,发送"预检请求"时,需要用到方法 OPTIONS ,所以服务器需要允许该方法。

预检请求(preflight request)

  跨域资源共享(CORS)标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站有权限访问哪些资源。另外,规范要求,对那些可能对服务器数据产生副作用的HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。  其实Content-Type字段的类型为application/json的请求就是上面所说的搭配某些 MIME 类型的 POST 请求,CORS规定,Content-Type不属于以下MIME类型的,都属于预检请求   所以 application/json的请求 会在正式通信之前,增加一次"预检"请求,这次"预检"请求会带上头部信息 Access-Control-Request-Headers: Content-Type:

OPTIONS /api/test HTTP/1.1
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type
... 省略了一些

  服务器回应时,返回的头部信息如果不包含Access-Control-Allow-Headers: Content-Type则表示不接受非默认的的Content-Type。即出现以下错误:

Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.


http://chatgpt.dhexx.cn/article/0RN3xhc0.shtml

相关文章

Nginx 解决跨域

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

1 Nginx跨域配置

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

Nginx跨域配置

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

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: 训练的轮次&#xff0c;最大不超过100 | :param batch: 训练的批次大小&#xff…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FlyAI小课堂:Tensorflow基操

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

FlyAI资讯:台积电布局新存储技术

摘要&#xff1a;近年来&#xff0c;在人工智能&#xff08;AI&#xff09;、5G等推动下&#xff0c;以MRAM&#xff08;磁阻式随机存取存储器&#xff09;、铁电随机存取存储器 (FRAM)、相变随机存取存储器&#xff08;PRAM&#xff09;&#xff0c;以及可变电阻式随机存取存储…

强烈推荐!FlyAI机器学习数据竞赛启动,丰厚奖金等你来拿

FlyAI 数据竞赛平台 FlyAI 是隶属于北京智能工场科技有限公司旗下&#xff0c;为AI开发者 &#xff08;深度学习&#xff09;提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例&#xff0c;样例所使用开发框架涉及TensorFlow、Keras、PyTorch. 支持…

FlyAI竞赛服务平台赛题上新——手写英文字体识别(名企内推)

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

万元大奖,FlyAI算法新赛事,心理卡牌目标检测

本文转自竞赛社区FlyAI最新上线算法赛。 “心理卡牌目标检测算法赛”由测测星座与趣鸭心理联合发起的线上竞赛项目。2020年新冠肺炎疫情打破了我们平静的生活&#xff0c;影响了我们的身体健康和精神健康。在国家发布的《“健康中国2030”规划纲要》中也提到&#xff0c;要加大…

百万现金奖励,FlyAI实时竞赛等你来战

点击我爱计算机视觉标星&#xff0c;更快获取CVML新技术 这是一种新的算法竞赛方式&#xff01; FlyAI是一个为算法工程师提供&#xff08;深度学习&#xff09;项目竞赛并支持GPU离线训练的网站。目前每周更新两个以上现金奖励的竞赛项目。项目涉及领域包括图像识别/分类/检测…