http - 在发送 POST 请求以避免 CORS 错误时绕过 OPTIONS 是否安全?
问题描述
我正在向请求 URL 发送 POST 并在标头中获取它。
Request URL: Request URL: https://www.host.com/path/file.php/api
Request Method: OPTIONS
Status Code: 200 OK
Remote Address: AA.BB.CC.DD:443
Referrer Policy: no-referrer-when-downgrade
Access-Control-Allow-Origin: *
Cache-Control: no-store, no-cache, must-revalidate
Connection: Keep-Alive
Content-Length: 3
Content-Type: text/html; charset=UTF-8
Date: Fri, 29 Nov 2019 09:54:10 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=5, max=100
Pragma: no-cache
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: PHPSESSID=eik5ssn2jc0514i2mu1943quk1; path=/
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Cache-Control: no-cache
Connection: keep-alive
Host: www.host.com
Origin: https://origin.com
Pragma: no-cache
Referer: https://origin.com/form
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36
这是我面临的 CORS 错误:
Access to XMLHttpRequest at 'https://www.host.com/path/api' from origin 'https://origin.com' has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.
core.js:6014 ERROR HttpErrorResponse {headers: HttpHeaders, status: 0, statusText: "Unknown Error", url: "https://www.host.com/path/api", ok: false, …}
我们正在使用 Angular,他们在后端使用 PHP。现在,后端团队(另一个城市,另一个开发团队)说我们不应该发送请求方法 asOPTIONS
而是直接发送POST
.
这里可能的情况是什么?我试图弄清楚如何绕过OPTIONS
. 这不是需要从他们那里解决的后端问题吗?
PS:我们成功发送了一个GET请求。
解决方案
错误消息告诉您Accept: text/html
不允许作为 CORS 的一部分(按照配置)。此堆栈溢出答案中建议的标头有一个很好的摘要。
您的浏览器首先对远程服务器进行 OPTIONS 调用,然后使用响应中的 CORS 标头来确定允许的 HTTP 请求。这称为预检请求。您无法控制此请求的发出。
来自服务器的 CORS 响应应包含标头:
Access-Control-Allow-Headers: Content-Type, etc...`
重要的是(从您的 HTTP 跟踪中并不清楚请求和响应之间的区别),Web 服务器需要使用此标头进行响应 - 将其放在您的 HTTP请求中将无济于事。
调试此问题的一种方法是: - 右键单击 Chrome 开发工具网络选项卡中的特定请求并复制为 cURL - 打开 Postman(如果您还没有安装它,请安装它:))并导入;过去您复制的 cURL “作为原始文本”,邮递员将导入 HTTP 请求。- 然后,您可以在调试时使用标头(并编写测试以确保 CORS 标头正确)。不要混淆;Postman 不会在飞行前进行 CORS,因此您需要手动组装这样的请求。
推荐阅读
- c - 如何将从文本文件中读取的整数传递给结构函数?
- python - 程序没有返回值
- c - 无法弄清楚如何通过 USB 将数据发送到从 stm32f103c8 到 PC 的帽子开关
- c# - C# 使用反射仅列出顶级类,不包括链接的类
- node.js - docker-compose up 无法构建 Gatsby app npm 问题
- python-3.x - 如何绘制分类与分类图?
- python - python plotnine:如何更改颜色比例
- graphql - GraphQL Playground 不断强制服务器的上下文函数运行?
- node.js - EADDRINUSE:地址已在使用 :::5000,每次我运行我的节点/反应应用程序时都会发生
- sql-server - 如何使用 T-SQL 分配永久唯一 ID