Laravel Websockets中Origin以HTTP而非HTTPS发送的问题排查
问题分析与解决方案
核心矛盾点排查
你的配置中存在多处加密参数冲突,这是引发签名错误、Origin异常的主要原因:
1. 修正后端广播配置(broadcasting.php)
当前options里encrypted: false与scheme: 'https'、useTLS: true完全矛盾,需保持加密参数一致性:
'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER'), 'encrypted' => true, // 改为true,与https/useTLS匹配 'host' => env('APP_URL_HOST'), // 建议用env变量,和前端域名保持一致 'port' => 6001, 'scheme' => 'https', 'useTLS' => true, 'curl_options' => [ CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0, ] ],
2. 修正前端Echo配置(app.js)
forceTLS: true强制加密连接,但encrypted: false关闭加密,两者冲突;同时确保密钥与后端一致:
window.Echo = new Echo({ broadcaster: 'pusher', key: document.querySelector('meta[name="pusher-key"]').content, // 建议通过meta标签注入,避免硬编码不一致 encrypted: true, // 和后端保持一致 wsHost: window.location.hostname, wssHost: window.location.hostname, wsPort: 6001, wssPort: 6001, forceTLS: true, disableStats: true, enabledTransports: ['wss'], // 强制TLS下仅保留wss传输 });
解决Origin以HTTP发送的问题
- 确保
.env中APP_URL为HTTPS格式:
APP_URL=https://your-domain.com
Laravel的路由、请求生成依赖该值,可保证WebSocket服务收到的Origin为HTTPS。
- 在
websockets.php中明确允许HTTPS域名:
'apps' => [ [ 'id' => env('PUSHER_APP_ID'), 'name' => env('APP_NAME'), 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'path' => env('PUSHER_APP_PATH'), 'capacity' => null, 'enable_client_messages' => false, 'enable_statistics' => true, 'allowed_origins' => [env('APP_URL')], // 指定允许的HTTPS Origin ], ],
解决「Invalid auth signature provided」错误
该错误几乎源于签名参数不匹配:
- 确认
PUSHER_APP_KEY、PUSHER_APP_SECRET、PUSHER_APP_ID在.env、broadcasting.php、前端三者完全一致,禁止硬编码不同值。 - 检查SSL证书路径有效性,建议使用绝对路径避免读取失败:
'ssl' => [ 'local_cert' => storage_path('ssl/fullchain.pem'), // 示例:证书存放在storage/ssl目录 'local_pk' => storage_path('ssl/privkey.pem'), 'passphrase' => env('LARAVEL_WEBSOCKETS_SSL_PASSPHRASE', null), 'verify_peer' => false, 'allow_self_signed' => true, ],
确保证书文件权限正确,Laravel进程可读取。
关于「cURL error 52: Empty reply from server」
当你将scheme改为HTTP时,后端尝试用HTTP请求已配置SSL的WebSocket服务,会被直接拒绝,因此必须保持scheme为HTTPS。
最后执行验证步骤:
- 清空配置缓存:
php artisan config:clear - 重启WebSocket服务:
php artisan websockets:serve - 重新编译前端资源:
npm run dev(若使用Mix/Vite)
内容的提问来源于stack exchange,提问作者Sukhwinder Sodhi
相关产品推荐
相关产品推荐

