【问题标题】:Ruby on Rails Thin and force_ssl, empty response over HTTPRuby on Rails Thin 和 force_ssl,HTTP 上的空响应
【发布时间】:2016-06-10 18:31:57
【问题描述】:

我最近在 CentOS 7.x 上设置了几个 Ruby on Rails 服务器,使用 Thin 作为 Web 服务器和 Comodo 的 SSL 证书。

我在我的config/environments/production.rb 文件中启用了force_ssl 选项,并且我正在使用以下命令运行我的服务器:

RAILS_ENV=production thin start -a <IP> -p 3000 --ssl --ssl-key-file <KEY FILE PATH> --ssl-cert-file <CERT FILE PATH>

我正在使用设计,所以在config/initializers/devise.rb我设置

config.rememberable_options = { secure: true }

我还在config/initializers/session_store.rb中设置了一些配置

Rails.application.config.session_store :cookie_store, key: '_secure_<domain>_session', httponly: true, secure: true

当我第一次从 Internet 浏览器通过 HTTP 访问我的服务器时,我收到一条空响应消息(已使用多个浏览器和多台计算机进行测试)。当我直接通过 https 访问它时,它可以很好地解析(并且 SSL 工作得很好),当我下次尝试通过 http 访问它时,它会很好地重定向。我不确定如何使用 nginx 或 Apache 修复此栏。

这是我读过的其他问题:

【问题讨论】:

    标签: ruby-on-rails ruby ssl


    【解决方案1】:

    Thin 只能侦听一个端口,并且每个实例只能提供 SSL 或非 SSL 请求。当thin 以--ssl 启动时,它会尝试将入站连接作为TLS 连接进行处理,并丢弃那些它无法协商的连接(即纯HTTP 请求)。

    您需要使用 nginx(或其他一些反向代理)侦听多个端口并终止 SSL,然后转发到 Thin。否则,您将需要运行多个 Thin 实例,一个提供 SSL,另一个不提供。

    【讨论】:

    • 说得好。你应该在 Nginx 上做。
    • 这是我想到的,非常感谢您的回复。作为记录,我使用 iptables 预路由将端口 80 和端口 443 上的连接转发到端口 3000。一旦您通过 HTTPS 访问服务器一次,它就会通过 HTTP 工作,但不是第一次(在给定的浏览器中)。我将设置nginx。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多