PHP 语法错误会导致 CORS 错误.为什么?



我正在开发一个电子商务,用户使用jQuery,管理员使用vue.js。

我在PHP中使用相同的MySQL查询,并通过AJAX将PHP连接到Web的两个部分。

这些文件在非 vue.js 部分,所以我需要在 PHP 响应中添加一些标头以允许访问,我正在使用这些:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Allow: GET, POST, OPTIONS, PUT, DELETE");
$method = $_SERVER['REQUEST_METHOD'];
if($method == "OPTIONS") {
die();
}

一切正常。但是当我犯了一个PHP语法错误时,(对于 例如一行没有分号(我收到下一条消息:

CORS 策略已阻止从源"http://localhost:8080"访问 XMLHttpRequest<路径>:对预检请求的响应未通过访问控制检查:请求的资源上不存在"访问控制-允许源"标头。

PHP 代码中的语法错误将使代码无法运行。

解释器只会输出错误并崩溃。从这个意义上说,CORS 错误是您最少的麻烦。

如果您想了解为什么会收到 CORS 错误而不是直接错误:在这些 AJAX 请求上,浏览器会在发送实际请求之前进行"预检"检查。

预飞行包括对将发出主请求的同一 URL 的OPTIONS请求(您似乎知道这一点,因为您正在尝试通过提前救助来处理OPTIONS类型的请求,这是正确的(。

但是,如果文件中存在语法错误,则不会执行任何语法错误,并且不会运行这些header()语句。如果Access-Control-*标头未返回到OPTIONS请求,则预检检查将失败,并且您会收到该错误。

简单修复:减少语法错误。

令人惊讶的是,语法错误完全改变了您可以检索的内容。但是想一想:CORS是你用PHP发送的一部分。如果 PHP 失败,则不发送或不发送不正确的 CORS 信息。您的权限系统崩溃了。

让我详细介绍一下为什么会发生这种情况的技术细节。

HTTP 响应以标头开头,之后有一个空行,然后是有效负载(HTML 文本或图像二进制(。

如果你有一个PHP错误,这个安排就会被打破。你得到一个空页面(PHP死亡白页(,或者你把错误消息混合到标题或有效负载中,或者单独。

您的浏览器应该让这些标头(以及其他标头(接受 CORS:

Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method
Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE

突然间,你有了这样的感觉:

Error : Parse error: syntax error, unexpected T_STRING, expecting ';' in file.php on line 17

CORS 失败,因为浏览器未获取正确的标头。

最新更新