通过 https 的 SSE 不工作
SSE over https not working
我在 https 上遇到 SSE 问题,让我说清楚,我有一个听 https 的 Nginx 服务器,后面有一个 Rails Puma,所以我在 js 中有这个(咖啡脚本):
initStream = () ->
rechargePayment.source = new
EventSource('/proggress/stream')
在 rails 控制器中我有:
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 尝试它,它就完美无缺。
编辑:我看到了这个:
"The EventSource interface is used to receive server-sent events. It connects to a server over HTTP and receives events in text/event-stream format without closing the connection."
来源: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 控制器中添加:
response.headers['X-Accel-Buffering'] = 'no'
我在 https 上遇到 SSE 问题,让我说清楚,我有一个听 https 的 Nginx 服务器,后面有一个 Rails Puma,所以我在 js 中有这个(咖啡脚本):
initStream = () ->
rechargePayment.source = new
EventSource('/proggress/stream')
在 rails 控制器中我有:
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 尝试它,它就完美无缺。
编辑:我看到了这个: "The EventSource interface is used to receive server-sent events. It connects to a server over HTTP and receives events in text/event-stream format without closing the connection."
来源: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 控制器中添加:
response.headers['X-Accel-Buffering'] = 'no'