即使我在文件functions.php中设置了头,错误仍然出现,我尝试了几个不同的钩子:
function add_cors_http_header()
{
if (isset($_SERVER['HTTP_ORIGIN'])) {
// Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
// you want to allow, and if so:
// header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
// may also be using PUT, PATCH, HEAD etc
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
exit(0);
}
}
add_action('init', 'add_cors_http_header');
add_action('send_headers', 'add_cors_http_header');
add_action('rest_pre_serve_request', 'add_cors_http_header');
(不能同时执行所有add_action)
我也试过不使用isset在header。php
编辑—根据要求,正在运行的客户端是香草Javascript,我在邮差上做了相同的抓取,它工作了,这是关于加入用户到不和谐的公会,这是代码:
const args = JSON.stringify({
access_token: token,
});
const response = await fetch(
`https://discord.com/api/guilds/${this.guildID}/members/${userID}`,
{
method: "PUT",
headers: {
"Content-Type": "application/json",
Authorization: `BOT ${this.bot_token}`,
},
body: args,
}
);
Access-Control-Allow-Origin(和类似的标头)是由服务器定义的,而不是客户端。在本例中,服务器是Discord API。
我猜这里的混乱是,你的客户端是JavaScript,但你试图在PHP修改头。我认为你应该尝试直接在JavaScript中添加标题。也许你需要一个Origin
头?
我建议看看你的邮差头被发送,并将它们添加到你的JavaScript。例如:
headers: {
"Content-Type": "application/json",
Authorization: `BOT ${this.bot_token}`,
Origin: "http://localhost",
},
如果这不起作用,打开你的Chrome开发工具,打开网络选项卡,看看传出的请求,看看它正在发送什么头,并将它们与邮差进行比较。如果Postman可以工作,只需重复它正在做的事情。
关于WordPress的功能,我认为你可以完全删除它,因为JavaScript是客户端,而不是PHP/WordPress。