位置: 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)

  • 非营利组织营利了怎么办
  • 预缴所得税退回
  • 营业执照副本上的二维码扫描不出来
  • 租土地使用权建房
  • 今年补交上年的对外捐赠(视同销售收入)的税怎么处理?
  • 质量赔偿款计入什么会计科目
  • 有两处收入的怎么报个税汇算清缴
  • 5000以下固定资产怎么做账
  • 企业法人网上可以注销吗
  • 其他综合收益影响所有者权益吗
  • 暂估入库可以跨年吗
  • 取得经营所得需要纳税人自行申报嘛
  • 品种法怎么计算在产品成本
  • 工会经费按什么计算的
  • 贷款利息进项税额转出
  • 个人出租住房缴纳个税可以扣除房产税吗
  • 退货后发票还能拿去抵税吗
  • 即用于一般计税又用于简易计税的固定资产抵扣
  • 小规模纳税人零申报什么意思
  • 客户忠诚度的表现行为有哪些
  • 赠票视同销售,借方计入什么科目?
  • 公司向股东借款需要股东会决议吗
  • 出口退税服务
  • 演出收入怎样做会计分录
  • 房租押金未全额缴纳
  • 微信转账记录怎么加回好友?
  • 物业公司的水电工工作职责
  • mac auto tune
  • win10系统关机后自动开机怎么办
  • php api
  • Content-Disposition使用方法和注意事项
  • 欧罗巴山脉自驾
  • 黑马程序员前端工程师简历
  • 生产型企业出口退税退的是哪部分的税
  • linux中php的作用
  • php判断数组是否为空的函数
  • get请求与post
  • 传统结算工具的不足有
  • 发票章与开票方名称不一致是什么情况
  • 个人垫款公司将款支付个人算是资金回流吗
  • 无偿受赠房屋 交个人所得税嘛
  • 甲供材甲方如何缴纳增值税
  • 固定资产清理往报表哪列示
  • 员工出差时法律规定
  • 资产处置损益影响损益吗
  • 自产产品用于职工福利按什么价格
  • 报关期限是如何规定的
  • 可以以公司名义贷款吗
  • 弹性预算列表法
  • 公司给材料商付款表格
  • 查缴个人海外避税所得税
  • 不带息银行汇票
  • 劳务公司机械租赁费列入什么费用
  • 净利润增长率计算方式
  • 银行汇票结算业务
  • 鉴证咨询服务费可以抵扣吗
  • 退回的银行手续费做什么科目
  • 旅行社开的机票款可以抵扣吗
  • 物业公司代业主委员会收公共收益怎么开发票
  • mysql 5.7.5 m15 winx64安装配置方法图文教程
  • mysql查询id最大的记录
  • sql事务处理
  • centos 离线安装git
  • win8系统忘记电脑开机密码怎么办
  • spoolsrv32.exe - spoolsrv32进程是什么文件 有何作用
  • windows8.1的设置在哪
  • linux常用命令touch
  • WIN10系统中软件打开找不到网络共享盘
  • 好好了解 英文
  • opengl perspective
  • 苹果macos安装
  • javascript 操作css
  • linux基本代码
  • linux jhat
  • 玩转兽世:兽夫,亲一个
  • 苏州税务ukey客服电话
  • 财务审计报告出现数据错误怎么处理
  • 员工离职了个人所得税年度汇算应申报未申报怎么处理
  • 汽车购置税发票有什么用
  • 湖北退役士兵退伍费
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设