使用 Nginx 轻松处理跨域请求(CORS)
使用 Nginx 轻松处理跨域请求(CORS)
在现代 Web 开发中,跨域资源共享(CORS)是一种重要的机制,用于解决浏览器的同源策略限制。CORS 允许服务器声明哪些来源可以访问其资源,从而确保安全性与可用性。本文将介绍如何在 Nginx 中配置跨域访问,并详细解析每个配置项的作用和用法。
什么是 CORS?
CORS(Cross-Origin Resource Sharing)是一种 HTTP 头部机制,允许服务器声明哪些外部域(origin)可以访问其资源。由于安全原因,浏览器通常不允许跨域请求,但通过 CORS,服务器可以显式地允许某些域访问其资源。
为什么需要 CORS?
- 安全性:保护用户数据,防止恶意网站进行未授权访问。
- API 访问:允许前端应用(如 React、Vue.js 等)安全地调用后端 API。
- 多源共享:在不同的子域、域或协议间共享资源。
Nginx 跨域配置示例
下面是一个 Nginx 跨域配置的示例代码:
# 设置跨域配置 Start
set $cors_origin "";
if ($http_origin ~* "^(https://x1.domain.com|https://x2.domain.com)$"){set $cors_origin $http_origin;
}
add_header Access-Control-Allow-Origin $cors_origin always;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS always;
add_header Access-Control-Allow-Credentials true always;
add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,x-auth-token always;
add_header Access-Control-Max-Age 1728000 always;
# 预检请求处理
if ($request_method = OPTIONS) {return 204;
}
# 设置跨域配置 End
配置说明
-
设置 CORS Origin:
set $cors_origin "";
:初始化 CORS 源为空,以备后续条件使用。if ($http_origin ~* "^(https://x1.domain.com|https://x2.domain.com)$")
:正则表达式用于匹配允许的来源。此示例中,只有来自mnswx.xjyun.cn
的请求会被允许。set $cors_origin $http_origin;
:如果来源匹配,则将$http_origin
的值赋给 $cors_origin。
-
添加 CORS 相关头部:
add_header Access-Control-Allow-Origin $cors_origin always;
:设置允许的来源。如果 $cors_origin 为空,将不会返回该头部,从而避免潜在的安全问题。add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS always;
:指定允许的 HTTP 方法。可以根据需求添加或删除方法。add_header Access-Control-Allow-Credentials true always;
:允许客户端发送凭证(如 cookies)。如果需要此项,客户端的请求也需要设置 withCredentials。add_header Access-Control-Allow-Headers ...
:允许特定的自定义请求头,确保前端应用能够发送必要的自定义头部。add_header Access-Control-Max-Age 1728000 always;
:设置预检请求的缓存时间,单位为秒。此设置可减少频繁的预检请求,提高性能。
-
处理预检请求:
if ($request_method = OPTIONS) { return 204; }
:对 OPTIONS 请求返回 204 状态码,表示请求成功但无内容返回。这样可以有效处理浏览器发起的预检请求。
常见问题
-
如何调试 CORS 问题?
- 使用浏览器的开发者工具,查看网络请求的响应头部,确认 CORS 头部是否正确设置。
- 检查是否存在跨域错误信息,确保允许的来源匹配请求来源。
-
如何处理多个允许的来源?
- 可以将多个域名用 | 连接,添加到正则表达式中。
- 另一种方法是通过 Lua 脚本或其他处理逻辑动态判断来源。
-
CORS 和安全性
- CORS 不是安全机制,而是一个合规性声明。确保只允许信任的域访问资源,以降低安全风险。
完整配置示例
以下是一个更完整的示例,展示了如何在 Nginx 的 server 块中配置 CORS:
server
{listen 80;listen 443 ssl http2;server_name x.domain.com;index index.php index.html index.htm default.php default.htm default.html;root /www/wwwroot/domain.com/public;# 设置跨域配置 Startset $cors_origin "";if ($http_origin ~* "^(http://https://x1.domain.com|https://x2.domain.com)$"){set $cors_origin $http_origin;}add_header Access-Control-Allow-Origin $cors_origin always; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS always;add_header Access-Control-Allow-Credentials true always;add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,x-auth-token always;add_header Access-Control-Max-Age 1728000 always;# 预检请求处理if ($request_method = OPTIONS) {return 204;}# 设置跨域配置 End#禁止在证书验证目录放入敏感文件if ( $uri ~ "^/.well-known/.*.(php|jsp|py|js|css|lua|ts|go|zip|tar.gz|rar|7z|sql|bak)$" ) {return 403;}location ~ .*.(gif|jpg|jpeg|png|bmp|swf)${expires 30d;error_log /dev/null;access_log /dev/null;}location ~ .*.(js|css)?${expires 12h;error_log /dev/null;access_log /dev/null;}access_log /www/wwwlogs/x.domain.com.log;error_log /www/wwwlogs/rc.kkdl.cn.error.log;
}
在这个示例中,x1.domain.com
和 x2.domain.com
域名的请求将启用 CORS 配置。
如果需要让Cors只对某一个路径的请求生效,可以参考一下配置示例:
server {listen 80;server_name example.com;location /api/ {set $cors_origin "";if ($http_origin ~* "^(http://example.com|https://example.com)$") {set $cors_origin $http_origin;}add_header Access-Control-Allow-Origin $cors_origin always;add_header Access-Control-Allow-Methods GET, POST, OPTIONS always;add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization always;add_header Access-Control-Allow-Credentials true always;add_header Access-Control-Max-Age 86400 always;if ($request_method = OPTIONS) {return 204;}proxy_pass http://backend_server; # 将请求代理到后端服务器}
}
在这个示例中,/api/
路径下的请求将启用 CORS 配置,并且请求将被代理到 backend_server
。
结论
通过上述配置,Nginx 能够正确处理跨域请求,允许指定的来源访问资源。合理的跨域配置不仅可以增强 Web 应用的灵活性,还能提高安全性。在实际应用中,记得根据需要进行调整和优化。希望本文对您有所帮助,欢迎讨论与交流。
相关文章:
使用 Nginx 轻松处理跨域请求(CORS)
使用 Nginx 轻松处理跨域请求(CORS) 在现代 Web 开发中,跨域资源共享(CORS)是一种重要的机制,用于解决浏览器的同源策略限制。CORS 允许服务器声明哪些来源可以访问其资源,从而确保安全性与可用…...

【LeetCode Hot100 二分查找】搜索插入位置、搜索二维矩阵、搜索旋转排序数组、寻找两个正序数组的中位数
二分查找 搜索插入位置搜索二维矩阵在排序数组中查找元素的第一个和最后一个位置寻找旋转排序数组中的最小值搜索旋转排序数组寻找两个正序数组的中位数(hard) 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并…...
使用MediaPipe Face Mesh 面部动作检测
一、技术选型 OpenCV(Open Source Computer Vision Library) 用于视频流捕捉、图像预处理和基本图像处理操作。 MediaPipe 提供高效的人脸检测与关键点提取功能(Face Mesh)。 Python 作为后端开发语言,整合上述库进行…...
【Vue】<script setup>和 <script>区别是什么?在使用时的写法区别?
<script setup> 是 Vue 3 引入的一种新的脚本语法,它提供了一种更简洁和声明式的方式来编写组件逻辑。它是为了解决传统 <script> 标签在 Vue 单文件组件(SFC)中的一些局限性而设计的。 <script setup> 与 <script>…...

微服务框架,Http异步编程中,如何保证数据的最终一致性
一、背景 在微服务框架下,跨服务之间的调用,当遇到操作耗时或者量大的情况,我们一般会采用异步编程实现。 本文出现的问题是:异步回调过来时,却未查询到数据库中的任务,导致未能正常处理回调。 下面是当…...

vue3-dom-diff算法
vue3diff算法 什么是vue3diff算法 Vue3中的diff算法是一种用于比较虚拟DOM树之间差异的算法,其目的是为了高效地更新真实DOM,减少不必要的重渲染 主要过程 整个过程主要分为以下五步 前置预处理后置预处理仅处理新增仅处理后置处理包含新增、卸载、…...

年会抽奖Html
在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…...
ubuntu16 重启之后lvm信息丢失故障恢复
一、背景 1、问题背景 业务有一台物理开发服务器,文件系统有损坏;由于重启时没有检查,导致重启卡住。后面通过断电重新启动之后,无法进入系统;进入救援模式,注释数据盘挂载。重启之后进入系统,…...
【华为OD-E卷 - 热点网站统计 100分(python、java、c++、js、c)】
【华为OD-E卷 - 热点网站统计 100分(python、java、c、js、c)】 题目 企业路由器的统计页面,有一个功能需要动态统计公司访问最多的网页URL top N。请设计一个算法,可以高效动态统计Top N的页面 输入描述 每一行都是一个URL或…...
Ubuntu下安装Android Sdk
下载android sdk命令行工具 https://developer.android.com/studio?hlzh-cn#command-tools mkdir android-sdk cd android-sdk unzip commandlinetools-linux-11076708_latest.zip 添加环境变量到~/.bashrc export ANDROID_HOME$HOME/android-sdk export PATH$PATH:$ANDRO…...

【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析
文章目录 类的加载器ClassLoader自定义类加载器双亲委派机制概念源码分析优势劣势如何打破Tomcat 沙箱安全机制JDK9 双亲委派机制变化 类的加载器 获得当前类的ClassLoader clazz.getClassLoader() 获得当前线程上下文的ClassLoader Thread.currentThread().getContextClassLoa…...

怎样修改el-table主题样式
起因:el-table有主题样式,部分需要单独设置 环境:ideanodejs插件谷歌浏览器 第一步:找到scss文件: 谷歌浏览器打开表格页面,ctrlshifti打开开发者工具,点击后鼠标移动到表格单元格上单击一下…...

MySQL(二)MySQL DDL数据库定义语言
1. MySQL DDL数据库定义语言 1.1. MySQL定义语言 进入MySQL mysql -u root -p(回车后输入密码,即可进入mysq1)1.1.1. 数据库操作 (1)查看数据库 mysql>show databases;注:MySQL语句分隔符为“;” mysql库很重要它里面有…...
Spring Boot 项目启动报 NoClassDefFoundError 异常的原因分析与解决方案 - jackson 版本不一致
目录 报错: 问题分析: 解决方案: 方案 1:对 Jackson 版本进行统一 方案 2:升级 Springfox 版本 方案 3:替换 Springfox 为 springdoc-openapi(推荐) 方案 4:排除冲突的 Jack…...

原型与原型链
什么是原型(对象) 在JavaScript中,每个对象都具有一个原型对象prototype,目的是:利用原型对象实现在同一原型链中的原型方法共享 在理解原型对象前,需要先了解什么是构造函数 构造函数 用来初始化对象的…...

【Linux】信号处理
一、Linux系统信号 1、常见的系统信号 常见的Linux系统信号 信号值描述1SIGHUP挂起(hang up)进程2SIGINT中断进(interrupt)程3SIGQUIT停止(stop)进程9SIGKILL无条件终止(terminate)…...

5个不同类型的mysql数据库安装
各种社区版本下载官方地址:MySQL :: MySQL Community Downloads 一、在线YUM仓库(Linux) 选择 MySQL Yum Repository 选择对应版本下载仓库安装包(No thanks, just start my download.) 下载方法1:下载到本…...

python学习笔记—12—布尔类型、if语句
1. 布尔类型 (1) 定义 (2) 比较运算符 (3) 代码演示 1. 手动定义 bool_1 True bool_2 False print(f"bool_1的内容是:{bool_1}, 类型是:{type(bool_1)}") print(f"bool_2的内容是:{bool_2}, 类型是:{type(bool…...

分数阶傅里叶变换代码 MATLAB实现
function Faf myfrft(f, a) %分数阶傅里叶变换函数 %输入参数: %f:原始信号 %a:阶数 %输出结果: %原始信号的a阶傅里叶变换N length(f);%总采样点数 shft rem((0:N-1)fix(N/2),N)1;%此项等同于fftshift(1:N),起到翻…...

《数据结构》期末考试测试题【中】
《数据结构》期末考试测试题【中】 21.循环队列队空的判断条件为?22. 单链表的存储密度比1?23.单链表的那些操作的效率受链表长度的影响?24.顺序表中某元素的地址为?25.m叉树第K层的结点数为?26. 在双向循环链表某节点…...
VSCode主题定制:CSS个性化你的编程世界
在今天的数字世界,编程环境已成为开发者的第二大脑,而主题正是个性化你的创意空间的关键。本文将指导你如何使用CSS自定义VSCode的主题,让你的IDE不仅功能强大,更具视觉个性。 思路分析 设计思路: 创建主色调基调和…...
SpringAI Alibaba实战文生图
1️⃣ 前置准备:搭建开发环境与服务配置🚀 🔧 1.1 环境要求 JDK 17(推荐 JDK 21)、Spring Boot 3.x(本案例使用 3.3.4)、阿里云百炼大模型服务 API Key。需在阿里云控制台完成服务开通并获取有…...
网络通讯知识——通讯分层介绍,gRPC,RabbitMQ分层
网络通讯分层 网络通讯分层是为了将复杂的网络通信问题分解为多个独立、可管理的层次,每个层次专注于特定功能。目前主流的分层模型包括OSI七层模型和TCP/IP四层(或五层)模型,以下是详细解析: 一、OSI七层模型&#…...

【JJ斗地主-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …...

AI生成的基于html+marked.js实现的Markdown转html工具,离线使用,可实时预览 [
有一个markdown格式的文档,手头只有notepad的MarkdownPanel插件可以预览,但是只能预览,不能直接转换为html文件下载,直接复制预览的内效果又不太好,度娘也能找到很多工具,但是都需要在线使用。所以考虑用AI…...
分布式微服务系统架构第144集:FastAPI全栈开发教育系统
加群联系作者vx:xiaoda0423 仓库地址:https://webvueblog.github.io/JavaPlusDoc/ https://1024bat.cn/ https://github.com/webVueBlog/fastapi_plus https://webvueblog.github.io/JavaPlusDoc/ 使用docker搭建常用开发环境 docker安装mysql docker ru…...

数据库同步是什么意思?数据库架构有哪些?
目录 一、数据库同步是什么 (一)基本概念 (二)数据库同步的类型 (三)数据库同步的实现方式 二、数据库架构的类型 (一)单机架构 (二)主从复制架构 &a…...

运行示例程序和一些基本操作
欢迎 ----> 示例 --> 选择sample CTRL B 编译代码 CTRL R 运行exe 项目 中 Shadow build 表示是否 编译生成文件和 源码是否放一块 勾上不在同一个地方 已有项目情况下怎么打开项目 方法一: 左键双击 xxx.pro 方法二: 文件菜单里面 选择打开项目...
消息队列处理模式:流式与批处理的艺术
🌊 消息队列处理模式:流式与批处理的艺术 📌 深入解析现代分布式系统中的数据处理范式 一、流式处理:实时数据的"活水" 在大数据时代,流式处理已成为实时分析的核心技术。它将数据视为无限的流,…...
Java 2D 图形类总结与分类
一、基本形状类 这些类用于绘制简单的标准几何形状。 1. 圆形 / 椭圆类 Ellipse2D:椭圆基类,支持浮点精度。 子类: Ellipse2D.Double:双精度浮点坐标。Ellipse2D.Float:单精度浮点坐标。 参数:x, y, wid…...