位置: IT常识 - 正文

Nginx跨域解决方案(nginx跨域配置详解)

编辑:rootadmin
Nginx跨域解决方案

推荐整理分享Nginx跨域解决方案(nginx跨域配置详解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nginx 解决跨域,nginx 解决跨域,nginx解决跨域的常用方案,nginx 跨域,nginx解决跨域问题原理,nginx跨域解决方案 8082,nginx 解决跨域,nginx 解决跨域,内容如对您有帮助,希望把文章链接给更多的朋友!

前置条件: 前端网站地址:http://localhost:4443 服务端网址:http://localhost:9081

当网站8080访问服务端接口的时候会产生跨域的问题

跨域主要设计到4个响应头:

Access-Control-Allow-Origin 用于设置允许跨域请求源地址 (预检请求和正式请求在跨域时候都会验证)Access-Control-Allow-Headers 跨域允许携带的特殊头信息字段 (只在预检请求验证)Access-Control-Allow-Methods 跨域允许的请求方法或者说HTTP动词 (只在预检请求验证)Access-Control-Allow-Credentials 是否允许跨域使用cookies,如果要跨域使用cookies,可以添加上此请求响应头,值设为true(设置或者不设置,都不会影响请求发送,只会影响在跨域时候是否要携带cookies,但是如果设置,预检请求和正式请求都需要设置)。不过不建议跨域使用,除非必要,因为有很多方案可以代替。

跨域请求时会先发送预检请求,浏览器首先会询问服务器,当前网页所在的域名是否在服务器的许可列表中,以及可以使用的请求头和请求方法。若得到肯定的答复,才会发送正式请求Xhr请求,否则报错

报错情况1

Access to XMLHttpRequest at ‘http://localhost:9081/api/’ from origin ‘http://localhost:4443’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No > ‘Access-Control-Allow-Origin’ header is present on the requested resource.

通过错误信息可以很清晰的定位到错误priflight说明是个预请求,CORS 机制跨域会首先进行 preflight(一个 OPTIONS 请求), 该请求成功后才会发送真正的请求。这一设计旨在确保服务器对 CORS 标准知情,以保护不支持 CORS 的旧服务器

解决方案:

server { listen 8080; server_name localhost; location / { add_header Access-Control-Allow-Origin 'http://localhost:4443'; proxy_pass http://localhost:9081; }}Nginx跨域解决方案(nginx跨域配置详解)

报错情况2

Access to XMLHttpRequest at ‘http://localhost:9081/api/’ from origin ‘http://localhost:4443’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: It does not have HTTP ok status.

通过报错信息提示可以得知,是跨域浏览器默认行为的预请求(option请求)没有收到ok状态码,此时再修改配置文件,当请求为option请求时候,给浏览器返回一个状态码(一般是204)

如果想要每次响应信息都携带头字段信息,需要在最后添加always(经我测试,只有Access-Control-Allow-Origin这个头信息需要加always,其他的不加always也会携带回来)

server { listen 8080; server_name localhost; location / { add_header Access-Control-Allow-Origin 'http://localhost:4443' always; if ($request_method = 'OPTIONS') { return 204; } proxy_pass http://localhost:9081; }}

报错情况3

Access to XMLHttpRequest at ‘http://localhost:9081/api/’ from origin ‘http://localhost:4443’ has been blocked by CORS policy: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response. 意思就是预请求响应头Access-Control-Allow-Headers中缺少头信息(各种情况会不一样,在发生跨域后,在自定义添加的头信息是不允许的,需要添加到请求响应头Access-Control-Allow-Headers中,以便浏览器知道此头信息的携带是服务器承认合法的)

server { listen 8080; server_name localhost; location / { add_header Access-Control-Allow-Origin 'http://localhost:4443' always; if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Headers '*'; #为什么写在if里面而不是接着Access-Control-Allow-Origin往下写?因为这里只有预检请求才会检查 return 204; } proxy_pass http://localhost:9081; }}

报错情况4 如果`if ($request_method = ‘OPTIONS’)``中配置了add_header,那么预检请求外部配置均会失效 官方文档

There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.

意思就是当前层级无 add_header 指令时,则继承上一层级的add_header。相反的若当前层级有了add_header,就应该无法继承上一层的add_header。

server { listen 8080; server_name localhost; location / { add_header Access-Control-Allow-Origin 'http://localhost:4443' always; if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin 'http://localhost:4443'; add_header Access-Control-Allow-Headers '*'; #为什么写在if里面而不是接着Access-Control-Allow-Origin往下写?因为这里只有预检请求才会检查 return 204; } proxy_pass http://localhost:9081; }}

但是由于此写法携带上两个 Access-Control-Allow-Origin ,这种情况也是不允许的 因此修正过的配置如下(其中*可以根据自己的需求替换)

server { listen 8080; server_name localhost; location / { if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin 'http://localhost:4443'; add_header Access-Control-Allow-Headers '*'; #为什么写在if里面?因为这里只有预检请求才会检查 add_header Access-Control-Allow-Methods '*'; add_header Access-Control-Allow-Credentials 'true'; return 204; } if ($request_method != 'OPTIONS') { add_header Access-Control-Allow-Origin 'http://localhost:4443' always; add_header Access-Control-Allow-Credentials 'true'; } proxy_pass http://localhost:9081; }}

或者

server { listen 8080; server_name localhost; location / { add_header Access-Control-Allow-Origin 'http://localhost:4443' always; add_header Access-Control-Allow-Headers '*'; add_header Access-Control-Allow-Methods '*'; add_header Access-Control-Allow-Credentials 'true'; if ($request_method = 'OPTIONS') { return 204; } proxy_pass http://localhost:9081; }}

参考文章:Nginx 轻松解决跨域问题

本文链接地址:https://www.jiuchutong.com/zhishi/300723.html 转载请保留说明!

上一篇:缺陷修改实践——replace函数的运用|思考?(缺陷修饰)

下一篇:【pytorch】有关nn.EMBEDDING的简单介绍(pytorch nn.parameters)

  • 怎样建设网站有利于网站推广(教你如何建立网站)

    怎样建设网站有利于网站推广(教你如何建立网站)

  • 荣耀50se时间怎么设置24小时(荣耀50se设置时间)

    荣耀50se时间怎么设置24小时(荣耀50se设置时间)

  • 天猫精灵TGC1是什么型号

    天猫精灵TGC1是什么型号

  • 华为位置共享怎么找到对方(华为位置共享怎么关闭)

    华为位置共享怎么找到对方(华为位置共享怎么关闭)

  • wps怎么调整页数(wps怎么调整页数顺序手机版)

    wps怎么调整页数(wps怎么调整页数顺序手机版)

  • 豆瓣访问太过频繁多久能恢复(豆瓣访问太快)

    豆瓣访问太过频繁多久能恢复(豆瓣访问太快)

  • 0x40000015怎么解决(0x0000024的处理方法)

    0x40000015怎么解决(0x0000024的处理方法)

  • airpods设置不了(airpods设置不了丢失)

    airpods设置不了(airpods设置不了丢失)

  • 苹果11pro max电池能用多久(苹果11pro max电池参数)

    苹果11pro max电池能用多久(苹果11pro max电池参数)

  • 红外功能是什么(红外功能是什么意思耳机)

    红外功能是什么(红外功能是什么意思耳机)

  • 苹果耳机充电时灯亮吗(苹果耳机充电时耳机要拿出来吗)

    苹果耳机充电时灯亮吗(苹果耳机充电时耳机要拿出来吗)

  • ipd是什么(华为ipd是什么)

    ipd是什么(华为ipd是什么)

  • 抖音注销对方关注里还有我吗(抖音注销后关注我的人还可以看到吗)

    抖音注销对方关注里还有我吗(抖音注销后关注我的人还可以看到吗)

  • 联想一体机怎么连接wifi(联想一体机怎么进入u盘启动)

    联想一体机怎么连接wifi(联想一体机怎么进入u盘启动)

  • 对方电话关机怎么回事(对方电话关机怎么找人联系)

    对方电话关机怎么回事(对方电话关机怎么找人联系)

  • 怎么将qq音乐下载到u盘(怎么将QQ音乐下载到本地)

    怎么将qq音乐下载到u盘(怎么将QQ音乐下载到本地)

  • 华为mate20是双扬声器吗(华为mate20双扬声器怎么样)

    华为mate20是双扬声器吗(华为mate20双扬声器怎么样)

  • 百度地图如何截大图(百度地图如何截屏)

    百度地图如何截大图(百度地图如何截屏)

  • 手机装sd卡会变慢吗(装上sd卡手机会不会变得流畅)

    手机装sd卡会变慢吗(装上sd卡手机会不会变得流畅)

  • 手机京东实名认证在哪(手机京东实名认证怎么改)

    手机京东实名认证在哪(手机京东实名认证怎么改)

  • 学习强国的收藏在哪里(强国收藏完了,怎么加分)

    学习强国的收藏在哪里(强国收藏完了,怎么加分)

  • 网络ip地址是什么意思(网络ip地址是什么,怎么查)

    网络ip地址是什么意思(网络ip地址是什么,怎么查)

  • airplay镜像一直在查找(airplay镜像开关在哪)

    airplay镜像一直在查找(airplay镜像开关在哪)

  • 华为bklal00什么型号(华为bzkl00是什么型号)

    华为bklal00什么型号(华为bzkl00是什么型号)

  • 华为mya一tl10是什么型号(华为mla-tl10什么型号手机)

    华为mya一tl10是什么型号(华为mla-tl10什么型号手机)

  • taskhost.exe是什么进程? taskhost.exe占用cpu的解决办法(taskhost window)

    taskhost.exe是什么进程? taskhost.exe占用cpu的解决办法(taskhost window)

  • 个人所得税计提和发放分录
  • 对方给我公司开的红字发票如何查询
  • 疫情期间生活服务业免征增值税截止时间
  • 隔月发票退回应该如何操作
  • 其他应付款二级明细
  • 残疾人保障金做什么会计科目
  • 应收退货成本递延
  • 销项税额特殊销售额的处理方式
  • 前期认证未抵扣
  • 融资租赁租金会计科目
  • 信用卡产生滞纳金
  • 天然气的销售需要什么资质
  • 培训费用可以开专票吗
  • 关于330技术维护费
  • 母公司捐赠给子公司原材料怎么处理
  • 一个月的销售额
  • uefi模式怎么装机
  • 鸿蒙负一屏怎么设置
  • 独立账户负债核算内容
  • 完税证明和纳税申报表是一种东西吗
  • php ajax json
  • 土地增值税清算全流程实战案例
  • 账务处理程序有什么
  • 计算机与自动化的关系
  • 土地增值税扣除系数
  • 固定资产一次性扣除申报表怎么填
  • php网站配置
  • 企业会计准则条文释义与案例详解
  • php获取长度
  • php冒泡法排序
  • php截取指定字符串
  • 借银行存款贷预收账款
  • js实现dialog
  • acpi disabled
  • java的基本
  • 汇总纳税企业所得税征收管理办法
  • 石油预付款发票怎么开
  • 安装织梦数据库连接不上
  • 税金及附加算什么
  • sql随机函数rand怎么用
  • 车辆购置税能否融资租赁
  • 计入当期损益的
  • 一般纳税人在任何情形下都可以领购使用增值税专用发票
  • 房地产企业建成后先出租的房地产
  • 应收账款科目的期末余额
  • 销售增长率计算公式财务管理
  • 会计核算的作用,意义
  • 货物已到发票未到怎么做账
  • 公司向股东个人借款怎么做账
  • 自来水公司代收污水处理费
  • 银行代扣出口快递费用
  • 利润太高,如何调产品收发存
  • 预收账款账务处理分录
  • 营业外收入明细账图片
  • 事业单位职工福利费支出范围
  • 商品销售成本的计算可以采用逆算成本法,其操作方法是
  • ubuntu怎样
  • solaris newfs
  • Win7系统无法安装SQL2000
  • win10输入法图标消失
  • win7如何关闭ie浏览器
  • win7如何设置桌面背景图
  • linux调整桌面分辨率
  • w7开机界面
  • 关于模型视图变化的说法
  • bootstrap应用
  • 置顶在哪里
  • nodejs读取文件字节数组
  • js中onmouseover
  • unity3d有什么用
  • shell脚本中实现rm -fr !(file1)
  • python生成随机数据
  • jquery操作文本可以使用什么方法
  • javascript模块化与非模块化开发区别
  • 房地产开发企业会计制度
  • 国家税务局湖南电子税务局登录
  • 农业部利剑行动
  • 无偿转让股权要交税吗
  • 河北省税务局地址邮编
  • 税务局社保服务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设