Codeigniter4处理Shopify Webhook时$request->headers()返回空值如何解决
问题原因
你直接输出$this->request->headers()返回的结果为空,是因为CodeIgniter4的headers()方法返回的是\CodeIgniter\HTTP\Header对象数组,对象的属性为受保护类型,直接print_r或者json_encode时无法正常输出属性值,并非没有获取到header。
解决方法
1. 单条header取值
直接调用getHeaderLine()方法即可直接获取指定header的字符串值:
// 示例:获取Shopify的hmac校验值 $hmac = $this->request->getHeaderLine('X-Shopify-Hmac-Sha256'); // 获取Shop域名 $shopDomain = $this->request->getHeaderLine('X-Shopify-Shop-Domain');
2. 批量获取所有header的键值对
如果需要遍历所有header,通过循环取出每个Header对象的value即可:
class ProdHook Extends Controller{ public function index(){ $headerObjects = $this->request->headers(); $headers = []; foreach ($headerObjects as $name => $headerObj) { $headers[$name] = $headerObj->getValue(); } // 此时$headers就是和getallheaders()返回结构一致的键值对数组 print_r($headers); } }
3. 异常情况处理
如果以上方法仍无法获取到值,先检查服务器环境的$_SERVER变量中是否存在HTTP_X_SHOPIFY_*前缀的变量:
- 如果不存在:是服务器配置过滤了自定义header,Nginx环境可以在站点配置中添加
underscores_in_headers on;后重启服务即可;Apache环境一般默认不会过滤自定义header,可检查是否有安全模块拦截了对应字段。 - 如果存在但CI4仍无法读取:确认你的控制器继承了框架官方的
BaseController,且BaseController中已初始化$request属性,没有被自定义代码覆盖。
内容的提问来源于stack exchange,提问作者Vicky M
相关产品推荐
相关产品推荐

