首页 > 解决方案 > 在命中任何代码之前出现 COR 问题,但仅限于浏览器 XHR 请求

问题描述

我有一个基于 CakePHP 的 API。它在大多数情况下都有效,但每隔一段时间浏览器对 API 的访问就会消失。XHR 请求响应上的错误消息是:

'Access to XMLHttpRequest at 'http://be:8888/api/pings' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

但是,如果我通过 POSTMAN 发出完全相同的请求(或者如果我直接浏览到 URL,而不是通过 XHR),它可以毫无问题地工作。我认为这可能是飞行前 OPTIONS 问题,但请求标头没有列出 aRequest Method并且 Apache 访问日志显示这些是 GET 请求。Apache 错误日志中没有任何相关内容。

重新启动 MAMP(即 Apache)并不能解决问题,也不能刷新本地 DNS 缓存。修复它的唯一方法是重新启动,之后它会再次正常工作几个小时,然后最终再次闪烁。

我想不出是什么原因造成的。我认为这不是真正的 CORS 中间件错误,因为重新启动修复了它并且 API 可以正常访问。此外,如果我die在 CORS 中间件__invoke方法中加入,它不会走得那么远(无论如何都应该首先击中 webroot 索引中的骰子)。

即使我通过die('here');在 webroot index.php 文件的开头禁用应用程序,我也会收到此错误。

即使我删除了index.php文件(在项目根目录和 webroot 中)以便浏览到 URL 显示 Apache 的默认错误404 not found: The requested URL /webroot/index.php was not found on this server,我在浏览器中通过 XHR 尝试时仍然会收到 CORS 错误。

自从升级到 Mac OS X Catalina 后,我才注意到这个问题。

这可能是什么原因造成的?

[更新:]这是系统重新启动后它在浏览器中工作的证据:

Summary
URL: http://be:8888/api/clients
Status: 200 OK
Source: Network
Address: ::1.8888

Request
GET /api/clients HTTP/1.1
Accept: application/vnd.api+json
Content-Type: application/vnd.api+json
Origin: http://localhost:8080
Accept-Language: en-gb
Access-Control-Allow-Origin: *
Host: be:8888
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate
Connection: keep-alive

但是,几个小时后它停止工作。如果它实际上是一个 CORS 问题,我的理解是它永远不会起作用。

标签: vue.jscakephpcakephp-3.0macos-catalinamamp-pro

解决方案


我不是 Apache/PHP 专业人士,但请确保您通过 HTTPS 查询 HTTPS 和通过 http 查询 http,换句话说,双方应该相同。另外,检查请求标头。并在请求标头中添加“access-control-origin”。


推荐阅读