当前位置: 首页 > article >正文

前后端跨域彻底弄懂:前端代理、Nginx线上部署、后端到底要不要配CORS?

文章目录一、前言二、先搞懂核心什么是跨域为什么后端才能根治1. 跨域的本质不是后端不让访问是浏览器不让过2. 什么是CORS三、本地开发环境前端配Proxy代理后端要不要管跨域1. 前端代理的核心原理2. 前端开发环境完整代理配置实例Vue/React① Vue项目代理配置vue.config.js② React项目代理配置setupProxy.js3. 关键结论四、线上生产环境两类方案详解Nginx代理 / 后端代码CORS方案一线上Nginx配置代理跨域95%生产项目首选1. 适用场景2. 完整Nginx实操配置实例3. 核心优缺点4. 关键结论方案二后端SpringBoot代码配置CORS跨域特殊备用场景1. 适用场景2. SpringBoot全局CORS实操配置实例生产可用3. 核心优缺点4. 关键结论五、生产环境三种场景全覆盖总结直接背一、前言做SpringBootVue/React前后端分离开发**跨域CORS**是每个开发者必遇的问题。但很多人一直搞不懂三个核心灵魂问题为什么跨域明明是前端调后端接口却要后端来解决本地开发的时候前端配了Proxy代理后端还需要处理跨域吗线上项目用了Nginx反向代理后端SpringBoot/Gateway还要不要开CORS跨域配置能不能两边都配二、先搞懂核心什么是跨域为什么后端才能根治1. 跨域的本质不是后端不让访问是浏览器不让过浏览器有一个同源策略安全机制规定协议、域名、端口号三个必须完全一致才叫同源浏览器正常放行请求。只要有一个不一样就是跨域。常见跨域场景前端http://localhost:8080后端http://localhost:8090端口不同 → 妥妥跨域。重点牢记跨域不是后端接口拒绝了你是浏览器拿到后端响应后觉得不安全直接拦截丢弃了响应数据。前端代码再怎么改也绕不开浏览器的安全规则所以跨域的最终根治方案永远只能靠服务端后端/Nginx授权。2. 什么是CORS**CORS跨域资源共享**就是服务端通过返回特殊响应头告诉浏览器这个域名的跨域请求是我信任的你别拦截直接放行。浏览器看到合法的CORS响应头就不会拦截跨域请求前后端就能正常联调交互。三、本地开发环境前端配Proxy代理后端要不要管跨域1. 前端代理的核心原理日常开发我们都是前端本地启动localhost:8080后端本地启动localhost:8090前端配置devServer代理把/stage-api/这类接口请求转发到后端8090前端请求代码写的是/stage-api/xxx看似调后端实际流程是浏览器请求前端本地服务localhost:8080/stage-api/xxx前端代理拦截这个请求偷偷转发给后端localhost:8090后端返回数据代理原路还给浏览器2. 前端开发环境完整代理配置实例Vue/React本地开发核心核心原则前端本地启代理抹平端口和域名差异全程无真实跨域后端无需新增任何跨域相关代码专注业务接口开发即可。下面附上Vue、React项目开箱即用的代理配置复制改改后端端口就能直接用。① Vue项目代理配置vue.config.js适用于Vue2/Vue3常规前后端分离开发统一匹配前端接口请求前缀/stage-api无缝转发至本地SpringBoot后端服务。module.exports{// 关闭生产环境sourceMap减少打包体积productionSourceMap:false,devServer:{// 开启本地代理核心配置proxy:{// 匹配所有 /stage-api 开头的接口请求/stage-api:{// 目标地址本地SpringBoot后端服务地址target:http://localhost:8090,// 开启跨域代理伪装修改请求头origin为目标后端地址changeOrigin:true,// 路径重写前端请求带/stage-api后端接口不带该前缀自动剔除转发pathRewrite:{^/stage-api:}}}}}② React项目代理配置setupProxy.jsReact项目需手动新建src/setupProxy.js配置代理配置逻辑和Vue一致适配React本地开发跨域规避需求。const{createProxyMiddleware}require(http-proxy-middleware);module.exportsfunction(app){app.use(/stage-api,createProxyMiddleware({// 目标后端服务地址target:http://localhost:8090,changeOrigin:true,pathRewrite:{^/stage-api:}}));};3. 关键结论浏览器全程只访问了同源的8080前端本地服务根本没有发生真实跨域既然没有跨域行为浏览器不会触发跨域拦截校验后端SpringBoot完全不需要任何跨域配置、不用CrossOrigin、不用全局CORS配置啥都不用写。浏览器全程只访问了同源的8080根本没有发生跨域既然没有跨域浏览器就不会拦截请求后端SpringBoot完全不需要任何跨域配置、不用CrossOrigin、不用全局CORS配置啥都不用写。四、线上生产环境两类方案详解Nginx代理 / 后端代码CORS项目打包上线后前端本地开发代理会失效代理仅dev环境生效必须选择一种线上标准方案处理跨域。线上只分方案一Nginx反向代理统一处理跨域企业主流推荐、方案二后端代码配置CORS处理跨域特殊场景备用二选一即可严禁同时启用。方案一线上Nginx配置代理跨域95%生产项目首选核心架构前端静态页面、后端接口共用同一个域名由Nginx作为统一入口浏览器访问天然同源跨域直接在Nginx层拦截处理和后端代码完全解绑后端无需任何跨域改造。1. 适用场景前后端部署在同一台服务器、企业常规线上架构、需要统一管控接口流量、不想修改后端业务代码的所有项目。2. 完整Nginx实操配置实例server { listen 80; # 线上统一业务域名 server_name xxx.你的业务域名.com; # 转发前端静态页面资源 location / { root /usr/local/nginx/html/front; index index.html; try_files $uri $uri/ /index.html; } # 匹配所有后端接口请求统一处理跨域代理转发 location /stage-api/ { # 生产安全配置不使用*仅允许自家前端域名访问 add_header Access-Control-Allow-Origin http://xxx.你的业务域名.com; add_header Access-Control-Allow-Methods GET, POST, PUT, DELETE, 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; # 允许携带Cookie、Token凭证 add_header Access-Control-Allow-Credentials true; # 直接拦截浏览器OPTIONS预检请求Nginx直接返回204不转发后端 if ($request_method OPTIONS) { return 204; } # 标准反向代理配置转发至后端网关/SpringBoot服务 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://gateway_server/; } } # 后端服务集群上游配置 upstream gateway_server { server 127.0.0.1:8090; }3. 核心优缺点✅ 优点跨域统一运维管控、不侵入后端代码、性能好、安全可控、后续改域名只改Nginx无需重启服务❌ 缺点需要运维配合配置Nginx简单运维操作即可无其他额外成本。4. 关键结论Nginx已全权接管跨域所有处理工作后端SpringBoot、Gateway无需编写任何CORS代码零配置即可。方案二后端SpringBoot代码配置CORS跨域特殊备用场景核心逻辑无Nginx统一代理前后端是完全不同的两个独立域名浏览器直接跨域请求由后端通过代码添加CORS响应头授权浏览器放行跨域请求。1. 适用场景前后端分属不同公司域名部署、无Nginx运维干预、临时快速上线测试项目、第三方接口对外提供访问的场景。2. SpringBoot全局CORS实操配置实例生产可用推荐全局配置类方式一劳永逸不推荐注解方式注解需每个控制器逐个添加维护麻烦。importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;/** * 生产环境后端全局CORS跨域配置 * 仅无Nginx代理的特殊场景使用 */ConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{OverridepublicvoidaddCorsMappings(CorsRegistryregistry){// 匹配后端所有接口路径registry.addMapping(/**)// 生产安全配置指定前端具体域名禁止使用*.allowedOrigins(http://xxx.你的前端域名.com)// 允许所有请求方法.allowedMethods(GET,POST,PUT,DELETE,OPTIONS)// 允许携带Token、Cookie等凭证.allowCredentials(true)// 预检请求缓存有效期1小时.maxAge(3600)// 允许所有请求头.allowedHeaders(*);}}3. 核心优缺点✅ 优点无需依赖Nginx运维代码层面直接搞定跨域部署简单❌ 缺点侵入业务代码后续修改前端域名需改代码重启服务安全性和统一运维性不如Nginx方案。4. 关键结论后端代码配置CORS后Nginx绝对不能再加任何跨域头否则重复响应头直接线上报错。绝对不能千万不要如果Nginx加了跨域头后端SpringBoot又配了全局CORS或者CrossOrigin注解浏览器会收到两份重复的Access-Control-Allow-Origin响应头直接报错The ‘Access-Control-Allow-Origin’ header contains multiple values浏览器不知道该信任哪一个直接拦截请求项目线上直接崩掉。跨域永远只允许「一个地方处理」要么前端开发代理、要么Nginx线上处理、要么后端CORS三选一绝不混用。五、生产环境三种场景全覆盖总结直接背运行环境跨域处理方式后端是否需要配CORS适用场景本地开发联调前端Vue/React配置devServer本地代理❌ 不需要日常前后端本地联调开发线上生产环境Nginx配置反向代理跨域头推荐❌ 不需要95%企业正规线上项目前后端统一域名部署线上生产环境后端SpringBoot代码配置全局CORS✅ 必须配前后端独立域名、无Nginx统一代理的特殊场景

相关文章:

前后端跨域彻底弄懂:前端代理、Nginx线上部署、后端到底要不要配CORS?

文章目录一、前言二、先搞懂核心:什么是跨域?为什么后端才能根治?1. 跨域的本质:不是后端不让访问,是浏览器不让过2. 什么是CORS?三、本地开发环境:前端配Proxy代理,后端要不要管跨域…...

中级OpenGL教程 004:为几何体注入法线灵魂

✨3D 渲染进阶|为 Geometry 几何体注入法线灵魂:从数据到渲染全流程指南Bilibili 同步视频🎯 核心目标:为几何体补齐法线属性🔍 核心认知:顶点重合≠数据复用📝 Step 1:手写立方体法…...

面向智能客服的对话状态跟踪与策略优化,智能客服的核心突破:从“听不懂人话”到精准理解用户意图——对话状态跟踪与策略优化完全指南

目录 第一部分:什么是对话状态跟踪?——智能客服的“工作记忆” 1.1 一个典型案例让你秒懂DST 1.2 状态跟踪的三个核心挑战 第二部分:从规则到预训练模型——DST的技术演进 2.1 基于规则和词典的早期方法 2.2 基于神经网络的方法——TRADE和SGD等经典模型 2.3 预训练…...

手把手教你用Vivado 2019.1在Kintex-7上搭建10G UDP协议栈(附12套源码)

Kintex-7 FPGA实战:从零构建10G UDP通信系统的完整指南 当我在实验室第一次看到Kintex-7开发板通过10G光纤传输数据时,那种流畅的数据流简直令人着迷。不同于传统的千兆以太网,10G网络带来的性能飞跃让实时高清视频传输、高速数据采集等应用成…...

资源紧巴巴的MCU,如何让PID控制又快又准?聊聊内存与执行时间的平衡术

资源紧巴巴的MCU,如何让PID控制又快又准?聊聊内存与执行时间的平衡术 在无人机电调、精密仪器等嵌入式控制领域,低成本MCU(如STM32F0、GD32)凭借其性价比优势占据重要地位。但这类芯片往往只有十几KB RAM和几十MHz主频…...

从手机到IoT:eMMC的RPMB安全分区,如何守护你的设备密钥与计数器

从手机到IoT:eMMC的RPMB安全分区如何守护设备密钥与计数器 在移动设备和物联网终端的安全架构中,密钥管理和防重放攻击始终是核心挑战。当Bootloader需要验证固件完整性时,当智能门锁需要保护开锁凭证时,当医疗设备需要确保处方数…...

ESP32S3新手避坑:用IDF5.0驱动GT911触摸屏,我踩过的三个雷都给你填平了

ESP32S3实战:GT911触摸屏驱动开发中的三大陷阱与深度解决方案 第一次把GT911触摸屏接到ESP32S3开发板上时,我以为这不过是个简单的I2C设备驱动问题——毕竟网上能找到不少现成的代码。但真正开始调试后才发现,从芯片版本差异到寄存器操作时序…...

LVGL模拟器实战:不用开发板,在VS Code里搞定UI原型和代码生成

LVGL模拟器实战:不用开发板,在VS Code里搞定UI原型和代码生成 在嵌入式GUI开发领域,LVGL以其轻量级和高度可定制的特性赢得了广泛青睐。但传统开发流程中,设计师和工程师往往需要反复烧录硬件才能验证UI效果,这种"…...

深入DDR3物理层:从MT41J128M16手册的CK#、ODT、ZQ校准,到FPGA硬件设计要点

深入DDR3物理层:从MT41J128M16手册的CK#、ODT、ZQ校准,到FPGA硬件设计要点 1. DDR3物理层设计的核心挑战 对于硬件工程师而言,DDR3接口设计堪称高速电路设计的"试金石"。MT41J128M16这类DDR3 SDRAM芯片虽然逻辑时序由控制器管理&am…...

如何免费修复损坏二维码:终极可视化像素级恢复工具完整指南

如何免费修复损坏二维码:终极可视化像素级恢复工具完整指南 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾经遇到过那些无法扫描的二维码?想象一下&#xff0…...

保姆级教程:用Linux Mint打造高效开发环境,从系统设置到顺手工具

从零构建Linux Mint高效开发环境:系统调优与生产力工具全指南 刚接触Linux Mint的开发者常会陷入两难——这个以优雅著称的发行版虽然开箱即用,但默认配置往往无法满足高强度开发需求。我曾见证一位同事在项目deadline前夜,因包管理器卡在海外…...

告别安卓模拟器!Windows系统直接安装APK的终极指南

告别安卓模拟器!Windows系统直接安装APK的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为电脑上无法直接运行安卓应用而烦恼吗?…...

GPT-5.5 Codex国内配置全攻略,三平台详细指南

作者:小卢 | 从事软件开发8年,专注AI编程工具评测 引言 作为一名有8年开发经验的技术老兵,我一直在关注AI编程工具的发展。最近GPT-5.5 Codex在国内环境下的使用需求激增,但很多开发者反映配置过程遇到各种问题。经过深度实测&am…...

农业IoT数据“看不见、看不懂、来不及”?用这3个PHP类库+2个CSS技巧,3小时上线可交互作物生长看板

更多请点击: https://intelliparadigm.com 第一章:农业IoT数据“看不见、看不懂、来不及”的本质困境 在广袤农田部署的土壤湿度传感器、气象站、无人机遥感节点与边缘网关,每天产生数TB级时序数据。然而,这些数据常陷入三重断裂…...

如何快速掌握大疆无人机固件自由:DankDroneDownloader终极指南

如何快速掌握大疆无人机固件自由:DankDroneDownloader终极指南 【免费下载链接】DankDroneDownloader A Custom Firmware Download Tool for DJI Drones Written in C# 项目地址: https://gitcode.com/gh_mirrors/da/DankDroneDownloader 你是否对大疆无人机…...

Go语言看门狗守护进程:实现进程监控与自动重启的高可用方案

1. 项目概述:一个守护进程的诞生与使命最近在折腾一个需要长时间稳定运行的后台服务,最头疼的问题就是进程意外退出。手动重启?太原始。写个脚本定时检查?不够优雅,也容易有延迟。直到我在GitHub上看到了hrygo/opencla…...

RISC-V CLIC中断机制实战:用中断咬尾优化你的嵌入式实时系统性能

RISC-V CLIC中断机制实战:用中断咬尾优化你的嵌入式实时系统性能 在嵌入式系统开发中,中断处理效率直接影响着实时性和系统吞吐量。传统的中断处理方式往往伴随着频繁的上下文保存与恢复,这不仅消耗宝贵的CPU周期,还增加了栈空间的…...

开关电源调制器原理与电流模式控制技术

1. 开关电源调制器基础解析在电力电子系统中,调制器如同交响乐团的指挥,精准协调着功率开关的启闭节奏。作为电源转换的核心控制单元,调制器通过调节脉冲宽度来实现能量的精确分配。这种看似简单的开关动作背后,隐藏着复杂的数学建…...

深度解析Cursor AI编辑器:重塑人机协作编程工作流

1. 从零到一:深度解析Cursor AI编辑器的核心价值与上手心法 如果你是一名开发者,最近一定在技术社区里频繁听到“Cursor”这个名字。它不仅仅是一个披着AI外衣的代码编辑器,更是一个试图重新定义“人机协作编程”工作流的革命性工具。我使用C…...

【紧急预警】2024年Q3起,主流农业IoT平台将停用HTTP轮询接口!立即升级你的PHP数据采集层(含MQTTv5迁移checklist与兼容性测试包)

更多请点击: https://intelliparadigm.com 第一章:农业IoT数据采集架构演进与HTTP轮询退役背景 传统农业IoT系统长期依赖基于HTTP的定时轮询(Polling)机制获取传感器数据,例如土壤温湿度、光照强度及CO₂浓度等。该模…...

HS2-HF_Patch:5分钟解锁《Honey Select 2》完整体验的终极指南

HS2-HF_Patch:5分钟解锁《Honey Select 2》完整体验的终极指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF_Patch是《Honey Select 2》玩…...

【AISMM落地生死线】:为什么83%企业卡在“治理维度”第2级?附5套行业级指标校准模板

更多请点击: https://intelliparadigm.com 第一章:AISMM模型全景概览与治理维度跃迁逻辑 AISMM(Artificial Intelligence System Maturity Model)并非传统能力成熟度模型的线性延伸,而是一种面向AI系统全生命周期的动…...

如何通过模块化AI工具实现图像处理优化:ComfyUI-Impact-Pack V8性能提升方案解析

如何通过模块化AI工具实现图像处理优化:ComfyUI-Impact-Pack V8性能提升方案解析 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and m…...

终极指南:如何免费获得跨平台开源音乐播放器LX Music Desktop的完美体验

终极指南:如何免费获得跨平台开源音乐播放器LX Music Desktop的完美体验 【免费下载链接】lx-music-desktop 一个基于 Electron 的音乐软件 项目地址: https://gitcode.com/GitHub_Trending/lx/lx-music-desktop LX Music Desktop是一款基于Electron开发的跨…...

从源码到上线:基于oh my opencode实战项目,用快马快速构建电商应用

从源码到上线:基于oh my opencode实战项目,用快马快速构建电商应用 最近在oh my opencode上发现了一个很实用的电商项目源码,正好想练手搭建一个简约的在线商城后端系统。这个项目包含了商品管理、购物车、订单处理等核心功能,特…...

【深度解析】Defender Control:Windows Defender权限管理终极解决方案

【深度解析】Defender Control:Windows Defender权限管理终极解决方案 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender…...

如何在5分钟内为Unity游戏安装模组:MelonLoader终极入门指南

如何在5分钟内为Unity游戏安装模组:MelonLoader终极入门指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 你是否…...

3分钟掌握Cbc:开源整数规划求解器终极指南

3分钟掌握Cbc:开源整数规划求解器终极指南 【免费下载链接】Cbc COIN-OR Branch-and-Cut solver 项目地址: https://gitcode.com/gh_mirrors/cb/Cbc Cbc(Coin-or Branch and Cut)是一款功能强大的开源混合整数线性规划(MIL…...

终极指南:如何为Amlogic电视盒子刷入Armbian系统并解决网络兼容性问题

终极指南:如何为Amlogic电视盒子刷入Armbian系统并解决网络兼容性问题 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, …...

UniVideo:视频多模态统一建模的技术突破与应用

1. 项目概述:视频多模态技术的融合革命UniVideo这个项目名称中的"Uni"前缀已经暗示了它的核心特性——统一性。作为从业者,我见证过太多视频AI模型在单一任务上的"偏科"现象:有的擅长动作识别却看不懂字幕,有…...