Drupal无头API服务器CORS配置无效问题求助
我之前也踩过一模一样的Drupal CORS坑,给你几个实用的排查方向,应该能解决你的问题:
确认你修改的是正确的配置文件
很多新手会犯这个错:修改了sites/default/default.services.yml,但Drupal实际加载的是同目录下的services.yml文件。default.services.yml只是个模板,不会被系统读取。你需要把default.services.yml复制一份,重命名为services.yml,然后在这个文件里修改CORS配置。确保CORS配置的完整性,尤其是OPTIONS方法
预请求(OPTIONS)是浏览器发起CORS请求的前提,必须在allowedMethods里明确包含它。同时allowedHeaders要覆盖你用到的所有请求头,包括Content-Type。给你一个经过验证的配置示例:cors.config: enabled: true allowedHeaders: - 'x-csrf-token' - 'authorization' - 'content-type' - 'accept' - 'origin' - 'x-requested-with' - 'access-control-allow-origin' allowedMethods: - 'GET' - 'POST' - 'PUT' - 'DELETE' - 'OPTIONS' allowedOrigins: - '*' # 生产环境建议指定你的前端域名,比如 'https://your-frontend-app.com' exposedHeaders: - 'x-csrf-token' maxAge: 1000 supportsCredentials: true修改配置后必须清除Drupal缓存
这是最容易被忽略的步骤!Drupal会缓存配置文件,修改完services.yml后,一定要清除缓存:- 用Drush命令:
drush cr - 或者登录Drupal后台,进入「配置」→「性能」页面,点击「清除所有缓存」
- 用Drush命令:
检查服务器层面的CORS设置
如果你的Drupal部署在Nginx或Apache后面,服务器本身可能配置了CORS规则,这会覆盖Drupal的设置。比如Nginx中如果添加了add_header Access-Control-Allow-Headers指令,要确保它包含Content-Type,或者直接移除服务器端的CORS配置,让Drupal来处理。用浏览器开发者工具验证响应头
打开浏览器的「开发者工具」→「Network」标签,找到OPTIONS预请求,查看响应头中的Access-Control-Allow-Headers是否包含Content-Type。如果没有,说明你的配置还没生效,回到第一步重新确认配置文件是否正确加载。
按照这几步排查下来,应该能解决你的问题——我当时就是漏了复制模板文件到services.yml,白折腾了好半天😅
内容的提问来源于stack exchange,提问作者Sudar

