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

nginx配置跨域--OPTIONS

今天在看一个跨域问题,主请求是一个PATCH请求,该请求并没有携带origin,然后直接报跨域。因此它也不会走到nginx配置的以下逻辑:

        if ($http_origin ~* (zz.com)) {
            add_header 'Access-Control-Allow-Origin' '$http_origin' always;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' '*';
            add_header 'Access-Control-Allow-Headers' '$http_access_control_request_headers' always;
            add_header 'Access-Control-Expose-Headers' '*' always;
	    }

然后它下面紧跟着一个OPTIONS请求,请求是没问题的,它是由如下分支返回的:

      if ($request_method = 'OPTIONS') {
          add_header 'Access-Control-Allow-Origin' '*' always;
          add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE' always;
          add_header 'Access-Control-Allow-Headers' '*' always;
          add_header 'Access-Control-Max-Age' 1728000 always;
          add_header 'Content-Length' 0;
          add_header 'Content-Type' 'text/plain; charset=utf-8';
          return 204;
        }

这个是以前前端同学配的,而且已经跑路,导致我其实有些困惑,因此研究了一下这个OPTIONS请求。

在跨域请求中,当发送 `PATCH` 请求时,浏览器会先发送一个 `OPTIONS` 请求进行预检。这是根据跨域资源共享(CORS)规范定义的行为。 预检请求的目的是为了检查服务器是否允许实际请求的跨域访问。在预检请求中,浏览器会发送一个 `OPTIONS` 请求,并携带一些跨域相关的头字段,如 `Origin`、`Access-Control-Request-Method`、`Access-Control-Request-Headers` 等。 服务器在接收到预检请求后,会根据请求头中的信息进行验证,并返回相应的响应头。如果服务器允许实际请求的跨域访问,它会在响应头中包含 `Access-Control-Allow-Origin`、`Access-Control-Allow-Methods`、`Access-Control-Allow-Headers` 等字段。 只有在服务器返回的预检请求的响应头中包含了 `Access-Control-Allow-Origin` 字段,并且允许请求的方法和头字段,浏览器才会继续发送实际的 `PATCH` 请求。 因此,当你在发送 `PATCH` 请求时,如果服务器没有正确配置跨域访问的相关响应头,浏览器会先发送一个 `OPTIONS` 请求进行预检,然后根据预检请求的响应头来决定是否继续发送实际的 `PATCH` 请求。 需要注意的是,预检请求和实际请求是两个独立的请求,它们之间可能存在一定的时间间隔。这也是为什么在某些情况下,`OPTIONS` 请求会在 `PATCH` 请求之前的原因。

因此怀疑是预检查返回的信息有问题,而且其他的GET之类的请求就毫无问题,因此把Access-Control-Allow-Methods中加上PATCH:

add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always;

恢复正常


http://www.kler.cn/a/272896.html

相关文章:

  • MTK6768 Android13 亮度条均匀调节实现
  • ESP8266固件烧录
  • 数据结构之双链表(C语言)
  • 数据结构-线性表
  • 集合帖:区间问题
  • apache-skywalking-apm-10.1.0使用
  • 客户端渲染与服务端渲染(2)
  • 罗马不是一天建成的:DevOps 转型分步指南
  • 深度学习_ResNet_5
  • rust最新版本安装-提高下载速度
  • 【Mysql使用变量时间提取group by的第一行数据】
  • 【C语言】病人信息管理系统
  • python打包时遇见第三方包有隐藏依赖或者出现依赖错误
  • 鸿鹄云商B2B2C:JAVA实现的商家间直播带货商城系统概览
  • 汽车信息安全--安全调试功能在量产后是否必须禁用(1)
  • 【WEEK2】Learning Objectives and Summaries【SpringMVC】【English Version】
  • 【Python】科研代码学习:十五 configuration,tokenization 的代码细节:Llama 为例
  • 【图论】树链剖分
  • 大模型prompt-文章生成
  • 上位机图像处理和嵌入式模块部署(qmacvisual畸变矫正)
  • Linux —— 定时任务(sleep、crontab、at)
  • 面试算法-38-最小覆盖子串
  • java入门 - 规范你的代码注释
  • SSH介绍及检测规则思路分析
  • 2024年Microsoft Office计算机二级考试必考45题
  • 19 # 高级类型:索引类型