You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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发送的问题

  1. 确保.env中APP_URL为HTTPS格式:
APP_URL=https://your-domain.com

Laravel的路由、请求生成依赖该值,可保证WebSocket服务收到的Origin为HTTPS。

  1. 在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。

最后执行验证步骤:

  1. 清空配置缓存:php artisan config:clear
  2. 重启WebSocket服务:php artisan websockets:serve
  3. 重新编译前端资源:npm run dev(若使用Mix/Vite)

内容的提问来源于stack exchange,提问作者Sukhwinder Sodhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:25:53