ruby-on-rails - 如何在启用 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 请求,尽管在非标准端口上。
解决方案
好的,所以我决定以错误的方式解决这个问题,而不是使用 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 了。
推荐阅读
- javascript - JS 中的作用域:这些变量不应该是全局的,而是在没有“var”或“let”的情况下声明。为什么?
- ios - 未调用 UI 更新委托方法
- progressive-web-apps - 渐进式网络应用
- html - 按钮订单具有不同的上边距,即使它们具有相同的 css 文件
- sqlite - 找不到类型“本地:EmailValidationBehavior”?
- c++ - C++ 继承向量问题(无限循环+在其他类中使用向量的问题)
- python - 按 0 级索引的最后一个值对 Pandas MultiIndex 进行排序
- pine-script - 由于某些未知原因,未绘制某些阻力
- node.js - Botframework 如何首先进行身份验证,然后使用令牌进行图形 API 调用
- javascript - 我正在尝试将 base64 编码的字符串转换为我的反应文件上的图像