我有一个woocommerce网站,我希望其REST API对世界开放。
我了解到需要设置CORS标头,因此我用Google搜索并设置了以下钩子:
add_action('rest_api_init', function() {
remove_filter('rest_pre_serve_request', 'rest_send_cors_headers');
add_filter('rest_pre_serve_request', function( $value ) {
header( 'Access-Control-Allow-Origin: *' );
header( 'Access-Control-Allow-Methods: OPTIONS, GET, POST, PUT, PATCH, DELETE' );
header( 'Access-Control-Allow-Credentials: true' );
header('Access-Control-Allow-Headers: Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Origin,Content-Type,X-Auth-Token,Content-Range,Range');
return $value;
});
}, 15);
我确认服务器使用正确的CORS标头进行响应:
Access-Control-Allow-Credentials:true
访问控制允许标题:
授权,DNT,X-CustomHeader,保持活动状态,用户代理,X-请求使用,If-Modified-Since,高速缓存控制,来源,内容类型,X-Auth-Token,内容范围,范围
允许访问控制的方法:选项,GET,POST,PUT,PATCH,DELETE
访问控制允许来源:*
访问控制公开标头:X-WP-Total,X-WP-TotalPages
然后我去为客户端编码:
xhr = new XMLHttpRequest();
xhr.open('POST', 'https://..../wp-json/wc/v3/products');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('Authorization', 'Basic ' + btoa('mykey:mysecret'));
xhr.send(JSON.stirngify({ ... });
以上代码是在Chrome控制台的https://google.com标签下输入的。我只是无法收到飞行前要求,这是错误:
选项https://..../wp-json/wc/v3/products 401(未经授权)
从源访问“ https://..../wp-json/wc/v3/products”处的XMLHttpRequest “ https://www.google.com”已被CORS政策屏蔽:对 飞行前请求未通过访问控制检查:它没有 HTTP正常状态。
即使响应头与上面发布的完全一样。
我在做什么错了?
答案 0 :(得分:0)
如果使用的是:“ Access-Control-Allow-Credentials” = true,请确保“ Access-Control-Allow-Origin”不是“ *”,必须使用适当的域进行设置!