首页 > 解决方案 > 如何在启用 SSL 的 Rails 应用程序中的单个 Rack::Proxy 请求中禁用 SSL?

问题描述

我有一个启用 SSL 的应用程序,我将特定请求重定向到旧应用程序,以避免 CORS 问题。事实上,这是一个处理打印请求但不支持 SSL 的 .Net 应用程序。重定向的请求尝试与 SSL 连接,从而在 Rails 应用程序日志中显示以下内容...

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3/TLS write client hello: wrong version number):

另一个应用程序根本不支持 SSL,因此它与验证 SSL 证书或 SSL 版本号无关。

目前我正在使用以下功能,当应用程序未在 SSL 下运行时,该功能很有效

def perform_request(env)

 request = Rack::Request.new(env)

 if request.path.include? "proxy_process_dispatch"

   env["http.read_timeout"] = (OFFICE_PRINT_TIMEOUT / 1000) - 1

   env["HTTP_HOST"] = OFFICE_IP + ':' + OFFICE_PRINT_SERVER_PORT     

   env["REQUEST_PATH"] = "/?process=true"

  super(env)

 else

   @app.call(env)

 end

end

似乎因为原始请求是 SSL,重定向的请求也是 SSL,但我需要确保它是标准的 HTTP 请求,尽管在非标准端口上。

标签: ruby-on-railssslproxy

解决方案


好的,所以我决定以错误的方式解决这个问题,而不是使用 Rack::Proxy 来转移请求以避免 CORS 问题,我只是使用 Net:HTTP 函数来创建一个新的、简单的请求。因此,我的应用程序向我的 rails 应用程序发出 JS 请求,并且我的 rails 路由将请求定向到控制器函数,如下所示: -

 require "net/http"
 require "uri"

 def process_dispatch_list
    uri = URI.parse("http://#{OFFICE_IP}")
    http = Net::HTTP.new(OFFICE_IP, OFFICE_PRINT_SERVER_PORT)
    http.use_ssl = false
    http.read_timeout = (OFFICE_PRINT_TIMEOUT / 1000) - 1
    request = Net::HTTP::Get.new(uri.request_uri + "?process_dispatch=true")
    response = http.request(request)
    case response
      when Net::HTTPSuccess
        render json: response.body, status: :ok
      else
        render json: response.body, status: :unprocessable_entity
    end  
  end

工作得很好,我的响应在前端 ajax 请求中被解释,并根据响应状态使用 pnotify 报告失败的成功。也不再需要 Rack:Proxy 了。


推荐阅读