axios.post(`https://aaa.cn/xml/scp-xml/php/api/index.php?class=survey&method=info`, {
id: "SCWJ202412-000003"
}, {withCredentials: true})
axios.post(`https://aaa.cn/xml/scp-xml/php/api/index.php?class=readerStu&method=login`, {
"account": "0888888",
"password": "qwer"
}, {withCredentials: true})
<?php
# 获取请求的 Origin
$Origin = $_SERVER['HTTP_ORIGIN'] ?? "";
# 允许的 Origins 列表
$Allowed = [
'http://localhost:51730',
'http://localhost:5173',
'https://scp-erp.aidingyi.cn'
];
# 检查请求的 Origin 是否在允许列表中
header("Access-Control-Allow-Origin: " . ( in_array( $Origin, $Allowed ) ? $Origin : "*" ) );
# 设置其他 CORS 头部
header("Access-Control-Allow-Credentials: true");
header('Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE');
header('Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type');
请问这是为什么 这也太离谱了
1.通配符 Origin: 当 Access-Control-Allow-Credentials 设置为 true 时,使用 "" 作为 Access-Control-Allow-Origin 的回退值可能会导致问题。如果 Access-Control-Allow-Origin 是 "" 且 Access-Control-Allow-Credentials 是 true,浏览器将阻止请求。
2.预检请求: 确保服务器正确处理 OPTIONS 请求,因为浏览器会使用这些请求来在发送实际请求之前检查 CORS 策略。
我把你的PHP代码改了一下
补充
强制触发预检请求,可以通过以下三种方法:
1. 添加自定义头部
添加自定义头部可以触发预检请求,因为自定义头部使请求变得不那么“简单”。
2. 使用非简单请求方法
使用非简单请求方法(例如
PUT
、DELETE
)可以触发预检请求。3. 更改内容类型
更改内容类型为非默认值(例如
application/json
)也可以触发预检请求。通过这些方法,可以强制触发预检请求,以确保服务器能够正确处理跨域请求。