尝试上传文件时出现“已被 CORS 策略阻止”

Posted

技术标签:

【中文标题】尝试上传文件时出现“已被 CORS 策略阻止”【英文标题】:Getting 'has been blocked by CORS policy' while trying to upload file 【发布时间】:2019-11-25 23:05:37 【问题描述】:

我试图设置一个 ui 用于使用 angular8 上传 excel 文件。前端和后端 (nodejs) 应用程序在两个不同的端口中运行。单击上传按钮时出现错误。

已尝试添加此代码:

app.use(cors());
app.use(function (req, res, next) 
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
  res.setHeader('Access-Control-Allow-Credentials', true);

  next();
);

还是一样的错误

打字稿:

url_='http://localhost:3000/product/upload-exel'
    public uploader :FileUploader = new FileUploader(
      url:this.url_
    );

html:

<input type="file"  id="file"
ng2FileSelect [uploader]="uploader"
[(ngModel)]="path">

选项http://localhost:3000/product/upload-exel 404(未找到) 从源“http://localhost:4000”访问“http://localhost:3000/product/upload-exel”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:“Access-Control-Allow-Origin”标头中的值当请求的凭证模式为“包含”时,响应不能是通配符“*”。 XMLHttpRequest 发起的请求的凭证模式由 withCredentials 属性控制。

【问题讨论】:

错误显示The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.。那么您可以尝试删除* 并添加您的客户端主机名吗?由于您使用的是 angular ,请尝试使用 localhost:4200 而不是 * 你可以在前端使用代理吗? ***.com/questions/47536466/… 我已将服务器地址更改为“Access-Control-Allow-Origin”,但仍然无法再次出现同样的错误。 我尝试使用代理仍然无法正常工作 【参考方案1】:

我的代码部署在 AWS 上,这对我有用:

除了在其他几个 Q/A 中说明的所有技术内容(待添加)外,请确保您的函数在 29 秒内将响应返回到前端。这是为您的响应设置的默认超时(和最大超时)。修复此问题后,我能够打破 CORS 错误。

【讨论】:

【参考方案2】:

错误信息表明当请求的凭证模式为“包含”时,响应中的“Access-Control-Allow-Origin”标头的值不能是通配符“*”。

如果您的后端服务器是 http://localhost:3000/ 并且您的客户端前端在 http://localhost:4000/ 上运行,那么您的后端标头应该是:

后端服务器

app.use(cors());
app.use(function (req, res, next) 
  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4000/');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, 
OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
  res.setHeader('Access-Control-Allow-Credentials', true);

  next();
);

【讨论】:

【参考方案3】:

在您的后端,由于您使用的是 cors 模块,因此您可以这样做并且很安全

var cors = require('cors')
var app = express()

//set options for cors
//add your frontend addresson in the origin 
//for testing add localhost  and port
var corsOptions = 
  origin: 'http://localhost:3000',
  optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204


//for specific endpoint enable cors
app.get('/products/:id', cors(corsOptions), function (req, res, next) 
  res.json(msg: 'This is CORS-enabled for only example.com.')
)

app.listen(80, function () 
  console.log('CORS-enabled web server listening on port 80')
)```

【讨论】:

【参考方案4】:

在 Mac 上使用 nginx(自制软件)时也可能发生这种情况

如果您启用调试错误日志记录,您可以在上传时看到此错误 - 这实际上是导致 CORS 错误的原因:

25 open() "/usr/local/var/run/nginx/client_body_temp/0000000001" failed (13: Permission denied)

这可能是自制 nginx 中的一个错误:https://github.com/denji/homebrew-nginx/issues/124

不确定这是否是正确的修复方法,但我能够让它以这种方式工作:

sudo chown YOUR-MACOS-USER /usr/local/var/run/nginx/client_body_temp/

之后重启nginx

【讨论】:

以上是关于尝试上传文件时出现“已被 CORS 策略阻止”的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cloud Functions for Firebase 时出现 CORS 错误

从源访问 XMLHttpRequest 已被 CORS 策略阻止

从源“null”访问“http://github/..file.json”处的 XMLHttpRequest 已被 CORS 策略阻止:

访问“http://....”源“http://localhost:4200”的 XMLHttpRequest 已被 CORS 策略阻止

CloudFront 已被 CORS 策略阻止

从源“http://localhost:3000”访问“https://***”处的 XMLHttpRequest 已被 CORS 策略阻止