WordPress API请求遭CORS拦截,Angular调用问题排查求助
解决WordPress REST API CORS拦截问题
问题根源分析
你遇到的错误核心是:服务端的预请求响应里没有明确允许Content-Type请求头,同时你的Angular客户端错误地添加了属于服务端的CORS响应头,这些头在请求里毫无作用。
第一步:修正Angular客户端代码
删掉请求中多余的CORS响应头(这些是服务端返回给浏览器的,客户端加了白加),而且GET请求不需要Content-Type头(除非你在请求体传数据,这里GET请求不需要),精简后的代码:
export class WpGetCurrentUserService { private apiUrl = 'https://mors.sg-host.com/wp-json'; private accessToken = 'uN...UU'; constructor(private http: HttpClient) { } getCurrentUser(): Observable<any> { // 只保留必要的Authorization头 const headers = new HttpHeaders() .set('Authorization', `Bearer ${this.accessToken}`); return this.http.get(`${this.apiUrl}/wp/v2/users/me`, { headers }); } }
第二步:完善WordPress服务端CORS配置(.htaccess)
之前的.htaccess只配置了允许跨域源,没处理预请求(OPTIONS)和允许的请求头,这是关键缺失。替换成以下完整配置:
<IfModule mod_headers.c> # 开发环境暂时允许localhost:8100,生产环境换成你的正式域名 Header set Access-Control-Allow-Origin "http://localhost:8100" # 允许的请求方法 Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" # 明确允许需要的请求头,包含Authorization和Content-Type Header set Access-Control-Allow-Headers "Authorization, Content-Type" # 允许携带凭证(WordPress应用密码认证需要) Header set Access-Control-Allow-Credentials "true" </IfModule> # 直接响应OPTIONS预请求,避免WordPress处理导致配置失效 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L] </IfModule> # 保留你的缓存禁用配置 <IfModule mod_headers.c> Header set Cache-Control "private" </IfModule>
备选方案:通过WordPress代码配置CORS
如果.htaccess配置在SiteGround上依然无效,可以尝试在主题的functions.php中添加以下代码,直接通过WordPress REST API钩子设置CORS头:
add_action('rest_api_init', function () { // 移除默认的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: http://localhost:8100'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); header('Access-Control-Allow-Headers: Authorization, Content-Type'); header('Access-Control-Allow-Credentials: true'); return $value; }); }, 15);
额外注意事项
- 修改配置后,一定要清空SiteGround的SuperCacher缓存(可以在SiteGround后台操作,或者联系客服),否则旧的缓存配置会生效。
- 生产环境不要用
*作为允许的源,换成你的正式域名,避免安全风险。
内容的提问来源于stack exchange,提问作者Mor Sagmon
相关产品推荐
相关产品推荐

