如何允许向/graphql端点发送GET请求而非POST并解决访问禁止问题
解决urql发送APQ GET请求到Strapi时的Forbidden错误
可能的原因及修复步骤
1. 检查Strapi的CORS配置
Strapi默认可能仅允许POST请求访问GraphQL端点,需在config/middlewares.js中更新CORS设置,允许GET方法并包含APQ相关请求头:
module.exports = [ // ...其他中间件 { name: 'strapi::cors', config: { origin: ['你的前端域名', 'Cloudfront域名'], methods: ['GET', 'POST', 'OPTIONS'], allowedHeaders: ['Content-Type', 'apollo-require-preflight'], credentials: true, maxAge: 31536000, }, }, // ...其他中间件 ];
修改后重启Strapi服务。
2. 开启Strapi APQ对GET请求的支持
默认Strapi的APQ插件仅处理POST请求,需在config/plugins.js中配置Apollo Server允许GET请求的APQ:
module.exports = ({ env }) => ({ // ...其他插件配置 graphql: { config: { endpoint: '/graphql', apolloServer: { persistedQueries: { allowGet: true, // 关键配置:启用GET请求的APQ支持 }, // ...其他Apollo相关配置 }, }, }, });
3. 验证urql的GET请求参数格式
urql发送APQ GET请求时,需确保哈希参数名为sha256Hash(Apollo APQ标准参数名),同时哈希生成逻辑与Strapi端一致:
import { createClient, cacheExchange, fetchExchange } from '@urql/core'; import crypto from 'crypto'; const client = createClient({ url: '你的Strapi GraphQL端点', exchanges: [cacheExchange, fetchExchange], fetchOptions: () => ({ method: 'GET' }), persistedQueries: { generateHash: (query) => crypto.createHash('sha256').update(query).digest('hex'), }, });
发送请求时,URL需包含sha256Hash参数(如有变量需追加variables参数),示例:https://your-strapi-domain/graphql?sha256Hash=abc123...&variables={"id":1}
4. 检查Strapi角色权限
进入Strapi后台,依次打开Settings > Users & Permissions Plugin > Roles,找到前端使用的角色(如Public):
- 找到
graphql权限组 - 勾选对应查询(如
about)的访问权限,确保允许GET请求
5. 排查Cloudfront配置
若请求经过Cloudfront,需确认:
- Cloudfront已将
sha256Hash、variables参数转发至Strapi源站 - Cloudfront未修改请求方法或添加导致Strapi拒绝的额外请求头
- 缓存策略允许缓存带上述参数的GET请求
测试验证
先用curl直接访问Strapi端点(跳过Cloudfront),确认请求是否正常:
curl "https://your-strapi-domain/graphql?sha256Hash=你的查询哈希值"
若直接访问正常,问题出在Cloudfront配置;若仍返回Forbidden,重新检查前4步的配置。
内容的提问来源于stack exchange,提问作者Muhammad Osama
相关产品推荐
相关产品推荐

