javascript - 通过 https 的 SSE 不工作

标签 javascript ruby-on-rails nginx redis server-sent-events

我在 https 上遇到 SSE 问题,让我说清楚,我有一个监听 https 的 Nginx 服务器,后面有一个 Rails Puma,所以我在 js(coffescript)中有这个:

initStream = () ->
   rechargePayment.source = new 
    EventSource('/proggress/stream')

在 Rails Controller 中我有:

  def stream
    response.headers['Content-Type'] = 'text/event-stream'
    redis = Redis.new
    redis.psubscribe(['proggress.refresh', 'heartbeat']) do |on|
      on.pmessage do |_pattern, event, data|
        response.stream.write("event: #{event}\n")
        response.stream.write("data: #{data}\n\n")
      end
    end
  rescue IOError
    logger.info 'Stream stoped'
  ensure
    logger.info 'Stopping Stream Thread'
    redis.quit
    response.stream.close
  end

当我通过 https 尝试此操作时,它什么也没做,在日志中我只看到错误:“Stream closed”,但如果我通过 http 尝试它,它会完美运行。

编辑:我看到了这个: “EventSource 接口(interface)用于接收服务器发送的事件。它通过 HTTP 连接到服务器,并在不关闭连接的情况下接收文本/事件流格式的事件。”

来源:https://developer.mozilla.org/en-US/docs/Web/API/EventSource

那么,这是否意味着它只能在 http 中工作?

最佳答案

是的,问题出在 nginx 上,我必须进行这些设置:

proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;

然后在 Rails Controller 中添加:

response.headers['X-Accel-Buffering'] = 'no'

关于javascript - 通过 https 的 SSE 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46371939/

相关文章:

javascript - Sapui5 中的布局,带有表单和网格表

javascript - 使用 Highcharts 和 AngularJs 的实时条形图

javascript - 如何增加/减少 HTML5 日期选择器值?

ruby-on-rails - CodeRay 样式表

ruby-on-rails - Rails find_by 返回不正确的记录?

javascript - 导入的 typescript 类的实例化似乎不起作用

ruby-on-rails - ActiveAdmin + CanCanCan 错误与 : protected method `authorize!' called for <Every ActiveAdmin Controller>

google-app-engine - 如何将反向代理用于 SSL 与 AppEngine 并使用用户服务?

node.js - 将 Nginx 设置为 Nodejs 和 Django 的代理

nginx - 从 Google Container Engine 转发 HTTPS 客户端 IP