WordPress发送PUT请求触发CORS错误,配置响应头后仍报错如何解决
问题根因
你完全搞错了CORS的生效逻辑:你当前的前端代码是直接向discord.com的API发起请求,CORS限制是由**被请求的目标站点(Discord)**的响应头决定的,你在自己的WordPress站点加任何响应头都不可能解决第三方API的跨域问题。
Postman能请求成功是因为它不属于浏览器环境,默认不会执行CORS同源策略校验,和你后端的配置没有任何关系。
另外你当前的实现存在致命安全漏洞:直接把Discord机器人令牌BOT ${this.bot_token}写在前端JS代码里,任何访问页面的用户都可以通过查看源码拿到这个令牌,进而完全控制你的Discord机器人,包括删频道、踢成员、批量发垃圾消息等高危操作。
正确解决方案
你必须通过自己的WordPress后端做请求代理,流程如下:
- 前端不要直接请求Discord API,改为请求你自己的WordPress自定义接口
- WordPress后端收到前端请求后,用服务端HTTP工具(curl/WordPress内置的
wp_remote_request)转发请求到Discord API - 后端拿到Discord的返回结果后,再回传给前端
这种方案下,跨域是你自己站点的前端请求自己的后端,你之前配置的CORS头才会生效,同时机器人令牌只会保存在后端代码里,不会泄露。
示例实现
后端WordPress接口代码(写在functions.php里)
// 注册自定义REST接口 add_action('rest_api_init', function () { register_rest_route('custom/v1', '/discord/add_member', [ 'methods' => 'PUT', 'callback' => 'discord_add_member_handler', 'permission_callback' => '__return_true', // 可根据需要调整权限校验,比如只允许登录用户调用 ]); }); function discord_add_member_handler(WP_REST_Request $request) { // 从前端请求拿参数 $user_id = $request->get_param('user_id'); $access_token = $request->get_param('access_token'); $guild_id = '你的服务器ID'; // 存在后端,不要传到前端 $bot_token = '你的机器人令牌'; // 绝对不要泄露到前端 // 转发请求到Discord API $response = wp_remote_request("https://discord.com/api/guilds/{$guild_id}/members/{$user_id}", [ 'method' => 'PUT', 'headers' => [ 'Content-Type' => 'application/json', 'Authorization' => "BOT {$bot_token}", ], 'body' => json_encode([ 'access_token' => $access_token ]) ]); // 返回Discord的响应给前端 return rest_ensure_response(json_decode(wp_remote_retrieve_body($response), true)); }
修改后的前端请求代码
const args = JSON.stringify({ access_token: token, user_id: userID }); const response = await fetch( `https://你的WordPress域名/wp-json/custom/v1/discord/add_member`, { method: "PUT", headers: { "Content-Type": "application/json", }, body: args, } );
内容的提问来源于stack exchange,提问作者Lucas Schulze
相关产品推荐
相关产品推荐

