预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 ...

Posted

技术标签:

【中文标题】预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 ...【英文标题】:Request header field … is not allowed by Access-Control-Allow-Headers in preflight response 【发布时间】:2017-12-20 11:16:35 【问题描述】:

我使用 react/express 和 django 作为后端。 我正在尝试集成 s3 精细上传器,但我遇到了这个问题:在发布请求中尝试从 django 获取签名时,Access-Control-Allow-Headers 在预检响应中不允许请求标头字段 Cache-Control。 通常我使用 fetch 在代码中提出所有请求,但在这里我使用包 https://github.com/FineUploader/react-fine-uploader 并且它使用 xhr ?有人遇到过这个问题

概要

错误:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 Cache-Control。

前端:React/express/webpack 后端:Dajngo 环境:本地(django server,react local api) 原因:xhr?

【问题讨论】:

【参考方案1】:

您似乎需要在初始化 Fine Uploader 时启用cors

import React,  Component  from 'react'
import FineUploaderTraditional from 'fine-uploader-wrappers'
import Gallery from 'react-fine-uploader'

// ...or load this specific CSS file using a <link> tag in your document
import 'react-fine-uploader/gallery/gallery.css'

const uploader = new FineUploaderTraditional(
    options: 
        chunking: 
            enabled: true
        ,
        cors: 
            //all requests are expected to be cross-domain requests
            expected: true,
            //if you want cookies to be sent along with the request
            sendCredentials: true
        ,
        deleteFile: 
            enabled: true,
            endpoint: '/uploads'
        ,
        request: 
            endpoint: '/uploads'
        ,
        retry: 
            enableAuto: true
        
    
)

class UploadComponent extends Component 
    render() 
        return (
            <Gallery uploader= uploader  />
        )
    

详情请见the documentation。

【讨论】:

【参考方案2】:

您的问题出在后端。似乎您尝试使用的 api 是用 django 编写的。

api 所有者需要将该标头显式添加到 CORS_ALLOW_HEADERS 设置中。上传图片时,我对 Content-Disposition 标头有同样的问题。这是我的设置:

CORS_ALLOW_HEADERS = ('content-disposition', 'accept-encoding',
                      'content-type', 'accept', 'origin', 'authorization')

在您的情况下,该设置需要包含“缓存控制”。

【讨论】:

【参考方案3】:

我遇到了完全相同的问题。我调用了一个 API,并添加了一个自定义标头。

我发现我的 fetch 的 POST 是错误的:

fetch('/api/login/', 
      method: 'post',
      headers: 
        'Content-Type': 'application/json',
        'X-Custom-Token': 'xccxcxcxcxcxc',
      ,
      body: JSON.stringify(
        username: this.state.email,
        password: this.state.password
      )
    )

我正在对格式错误的 json 输入进行字符串化。我刚刚修复了 json 有效负载,它工作正常:

fetch('/api/login/', 
        method: 'post',
        headers: 
          'Content-Type': 'application/json',
          'X-Custom-Token': 'xccxcxcxcxcxc',
        ,
        body: JSON.stringify(
          'username': this.state.email,
          'password': this.state.password
        )
      )
       

【讨论】:

以上是关于预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 ...的主要内容,如果未能解决你的问题,请参考以下文章

预检响应没有 HTTP ok 状态。 Angular 6 中的 403

OAuth 中的 CORS:对预检请求的响应未通过访问控制检查

预检响应中的 Access-Control-Allow-Headers 不允许授权

预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段内容类型

预检响应中的 Access-Control-Allow-Header 中的允许请求标头字段

预检响应中的 Access-Control-Allow-Methods 不允许方法 PATCH