WordPress自定义CORS header未授权问题求助
问题场景
使用JavaScript fetch请求FaustWP授权接口时,返回错误x-faustwp-secret headers is not authorized,请求代码如下:
let response = await fetch('https://mywebsite.com/?rest_route=/faustwp/v1/authorize', { headers: { 'Content-Type': 'application/json', 'x-faustwp-secret': apiClientSecret, }, method: 'POST', body: JSON.stringify({ code }), });
启用CORS绕过扩展后请求正常,但自行在WordPress functions.php 和 .htaccess 中配置CORS头无效。
可能原因及解决步骤
1. WordPress REST API的CORS处理优先级冲突
WordPress REST API默认自带CORS处理逻辑,send_headers 钩子的执行时机晚于REST API内置的CORS头设置,导致自定义配置被覆盖。
解决方法:使用REST API专属钩子替代send_headers,直接修改REST响应的CORS规则:
add_action('rest_api_init', function () { // 移除默认的REST CORS处理 remove_filter('rest_pre_serve_request', 'rest_send_cors_headers'); // 添加自定义CORS规则 add_filter('rest_pre_serve_request', function ($value) { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type, x-faustwp-secret'); return $value; }); });
注意:不要混用通配符*和指定请求头,直接明确列出允许的字段,避免浏览器解析歧义。
2. CORS预检请求(OPTIONS)未被正确响应
浏览器发送POST请求前会先发送OPTIONS预检请求,验证服务器是否允许自定义头。如果服务器未正确处理OPTIONS请求,浏览器会拦截后续的实际请求。
解决方法:在.htaccess中添加OPTIONS请求处理规则(Apache环境):
<IfModule mod_headers.c> # 确保所有响应都携带CORS头 Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "GET, POST, OPTIONS" Header always set Access-Control-Allow-Headers "Content-Type, x-faustwp-secret" # 针对OPTIONS请求直接返回200状态码,避免WordPress返回404 RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L] </IfModule>
如果是Nginx环境,需在站点配置中添加:
location /wp-json/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, x-faustwp-secret"; # 处理OPTIONS预检请求 if ($request_method = OPTIONS) { return 204; } }
3. 验证x-faustwp-secret值及接口路径正确性
- 确认前端的
apiClientSecret与WordPress后台「FaustWP设置」中的Client Secret完全一致,注意大小写、空格及特殊字符 - 建议使用标准REST API路径
https://mywebsite.com/wp-json/faustwp/v1/authorize替代?rest_route=的写法,避免URL解析异常
4. 排查服务器安全限制
- 检查WordPress安全插件(如Wordfence)是否拦截了自定义请求头,需将
x-faustwp-secret添加到插件的「允许请求头」列表中 - 确认服务器已启用
mod_headers模块(Apache),可通过phpinfo()查看模块状态
内容的提问来源于stack exchange,提问作者Xanthous
相关产品推荐
相关产品推荐

