rem*_*yml 1 php cors symfony ionic-framework
我在开发应用程序 I\xe2\x80\x99m 时遇到问题。\nAPI 使用 PHP Symfony 4,该应用程序是使用 Ionic 4 制作的。
\n\n我在执行 PATCH 请求时遇到问题。该请求在 POSTMAN 和我的手机上运行得很好\n但我在浏览器(Google Chrome、Firefox)上尝试时遇到了 CORS 问题。
\n\n我已经询问过,并且了解到 PATCH 请求首先会经过飞行前请求,因此会使用 OPTIONS 方法向我的 API 发送请求。
\n\n我管理了这个方法并返回了代码 200,然后我允许在我的 index.php 文件中使用正确的标头,如下所示:
\n\nheader(\'Access-Control-Allow-Origin: *\');\nheader("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");\nheader("Access-Control-Allow-Methods: GET, HEAD, PATCH, OPTIONS, POST, PUT");\nRun Code Online (Sandbox Code Playgroud)\n\n一开始,我遇到了第一个错误,表明请求没有返回代码 200,因此我在 API 中管理 OPTIONS 方法。\n然后出现以下错误:
\n\nNo \'Access-Control-Allow-Origin\' header is present on the requested resource.\nRun Code Online (Sandbox Code Playgroud)\n\n这很奇怪,因为之前没有出现过该错误,并且所有其他请求都有效。
\n\n此外,我尝试使用 POSTMAN 和 OPTIONS 方法返回正确的标头。
\n\n你能帮助我吗?
\n\n抱歉英语很粗糙。
\n对于将来发现此问题的任何人,我已经重现了这些确切的症状,并解决了我的问题。简而言之,当在客户端指定该方法时(例如在选项中fetch),PATCH具体是区分大小写的,而其他方法则不区分大小写。需要大写。
据我所能推断出的最佳解释是,尽管RFC7230规定方法应该大写,但它们也区分大小写。浏览器通过自动大写其中几个来平滑这个问题,我相信基于RFC7231,它定义了许多常用方法,但没有定义 PATCH。考虑以下从客户端发起的请求。
fetch('https://stackoverflow.com',
{ method: 'post',
body: JSON.stringify({message: 'testing a cors issue'}),
headers: {'Content-Type': 'application/json'}
}
)
Run Code Online (Sandbox Code Playgroud)
至少 Chromium 浏览器的正常行为是自动将Access-Control-Request-MethodCORS 预检标头中的方法大写,而不管我的 JavaScript 在 fetch 调用中使用的大写形式如何。
同样,如果方法是DELETE,浏览器也会在预检时自动将其大写。
但是,我发现该PATCH方法(稍后在RFC5789中定义)被视为自定义 HTTP 方法,因为它没有强制大写。因此,它区分大小写,这在 CORS 预检期间可以观察到。如果客户端应用程序以小写形式指定它patch,则它在 Access-Control-Request-Method 标头中的显示方式是这样的,如果它是大写的,则PATCH它在标头中显示为大写。
当您在 Postman 中选择PATCH方法时,它始终是大写的,这掩盖了问题的根本原因。尽管错误消息与标头有关Access-Control-Allow-Origin,但我看到的根本原因是该方法的区分大小写。
| 归档时间: |
|
| 查看次数: |
3232 次 |
| 最近记录: |