首页 > 解决方案 > 在发送 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请求。

标签: httppostcorsoptions

解决方案


错误消息告诉您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,因此您需要手动组装这样的请求。


推荐阅读