PHP警告:Undefined array key 'HTTP_X_WC_WEBHOOK_SIGNATURE'求助
解决WooCommerce Webhook请求头丢失引发的PHP警告
问题确认
你的判断是对的,GoDaddy主机确实存在拦截或移除自定义HTTP请求头的情况,尤其是X-WC-Webhook-Signature这类非标准请求头。测试站点正常触发Webhook,说明配置本身没问题,问题出在生产环境的主机限制。
可行解决方案
1. 修改.htaccess保留请求头
在WordPress根目录的.htaccess文件中添加以下规则,强制把原始请求头映射到PHP能读取的变量:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP:X-WC-Webhook-Signature} ^(.*)$ RewriteRule .* - [E=HTTP_X_WC_WEBHOOK_SIGNATURE:%1] </IfModule>
这段代码会将X-WC-Webhook-Signature头重新赋值给HTTP_X_WC_WEBHOOK_SIGNATURE,确保PHP的$_SERVER数组能获取到。
2. 调整插件代码的请求头读取逻辑
如果.htaccess修改无效,直接在插件代码中兼容多种读取方式,避免未定义索引警告:
// 替换原有的$_SERVER['HTTP_X_WC_WEBHOOK_SIGNATURE']读取逻辑 $signature = ''; // 尝试读取标准命名的头 if (isset($_SERVER['HTTP_X_WC_WEBHOOK_SIGNATURE'])) { $signature = $_SERVER['HTTP_X_WC_WEBHOOK_SIGNATURE']; } // 尝试读取原始头名称 elseif (isset($_SERVER['HTTP_X_WC_WEBHOOK_SIGNATURE'])) { $signature = $_SERVER['HTTP_X_WC_WEBHOOK_SIGNATURE']; } // 尝试通过getallheaders()函数获取 elseif (function_exists('getallheaders')) { $headers = getallheaders(); if (isset($headers['X-WC-Webhook-Signature'])) { $signature = $headers['X-WC-Webhook-Signature']; } } // 处理签名缺失的情况 if (empty($signature)) { error_log('Webhook signature not found'); wp_send_json_error('Invalid request', 403); } // 后续验证逻辑使用$signature变量
3. 联系GoDaddy支持解除拦截
直接提交工单给GoDaddy技术支持,明确询问是否启用了请求头过滤规则,要求将X-WC-Webhook-Signature头加入白名单。部分主机的ModSecurity等安全模块会拦截自定义头,需要人工调整。
4. 临时替代验证方案(不推荐长期使用)
如果以上方法都无法解决,可以临时改用URL参数验证:
- 在WooCommerce的Webhook URL中添加自定义参数,比如
https://your-site.com/webhook-endpoint?secret=your_unique_key - 在插件中验证该参数:
$valid_secret = 'your_unique_key'; $received_secret = isset($_GET['secret']) ? $_GET['secret'] : ''; if ($received_secret !== $valid_secret) { wp_send_json_error('Unauthorized', 403); }
注意:这种方式安全性低于签名验证,仅作为临时应急方案。
内容的提问来源于stack exchange,提问作者maccadies
相关产品推荐
相关产品推荐

