2

我正在运行一个 Rails 3.1.4 应用程序,该应用程序需要一些页面使用 force_ssl,但其他一些我不想使用 SSL。force_ssl 有没有相反的东西,比如 force_http?问题是我有一些不需要 SSL 的页面,并且它们包含我无法使用 https 拉过来的元素(因此用户从浏览器中得到不安全的错误)。

发生的情况是,当有人转到 force_ssl 页面时它工作正常,但是当他们转到不是 force_ssl 的其他页面时,他们会从浏览器收到不安全的页面错误,因为 https 仍然存在。因此,我想强制我无法使元素 https 避免使用 SSL 的页面(即强制它回到 http)。

先感谢您。

4

3 回答 3

5

好的,我找到了一种似乎对我有用的方法:

在我的会话控制器中,我添加了这个:

force_ssl :only => [:new, :create]

所以只有这两个动作会被 SSL 调用。现在,用户成功登录后,页面将重定向到非 SSL 连接。

至于强制页面为非 SSL,请尝试以下问题:Rails 3.1 Force Regular HTTP,使用 before_filter 查找 Joost 的答案。

这是他发布的内容:

class ApplicationController < ActionController::Base
  before_filter do
    if request.ssl && Rails.env.production?
      redirect_to :protocol => 'http://', :status => :moved_permanently
    end
  end
end

免责声明:上面的代码不是我的,我从链接中的问题中复制了它,只是为了方便起见放在这里。请访问上面的链接以查看其原始上下文。

此外,关于强制非 SSL,我不确定这是一个好主意。如果用户请求 SSL 连接并且您拥有证书,为什么不给他们呢?我同意 SSL 确实给浏览器带来了更大的压力,但有些人一直喜欢在 SSL 上冲浪。如果您有一些不能通过 SSL 运行的代码,那么这是强制使用非 SSL 的正当理由。

干杯。

于 2012-05-18T08:33:04.670 回答
0

让它在没有循环的情况下工作。除非它发生在我不知道的浏览器中。

before_filter do
  unless params[:controller] == 'whatever_controller_name_you_are_serving_https_to'
    if request.ssl? && Rails.env.production?
      redirect_to :protocol => 'http://', :status => :moved_permanently
    end
  end
end
于 2014-07-02T20:04:38.227 回答
0

force_ssl假设(希望)您已升级到受支持的 Rails 版本,除非声明,否则这是实现默认非 SSL 的一种简单方法。它的形式是ActiveSupport::Concern

module ForceNoSSL
  extend ActiveSupport::Concern

  ACTION_OPTIONS = [:only, :except, :if, :unless]

  def force_no_ssl_redirect
    if request.ssl?
      options = {
        :protocol => 'http://',
        :host     => request.host,
        :path     => request.fullpath,
        :status   => :moved_permanently
      }

      redirect_to ActionDispatch::Http::URL.url_for(options)
    end
  end

  class_methods do
    def force_ssl(options = {})
      super

      action_options = options.slice(*ACTION_OPTIONS)
      skip_before_action :force_no_ssl_redirect, **action_options
    end

    def force_no_ssl
      before_action :force_no_ssl_redirect
    end
  end
end

那么在你的ApplicationController你:

include ForceNoSSL
force_no_ssl

它的工作原理是默认情况下所有操作都将运行force_no_ssl_redirect回调。如果它已经是非 ssl 连接,则不会执行任何操作,否则请求将被重定向到http://.

但是,如果您已声明force_ssl,则将force_no_ssl_redirect跳过回调(仅适用于 指定的那些操作ACTION_OPTIONS)。

您可以扩展它以允许force_no_ssl接受 URL 选项等......就像force_ssl操作一样,但对于我的用例来说,这不是必需的。

PS 很多代码都来自于此,ActionController::ForceSSL因此请查看以获取更多信息。

于 2017-11-23T22:26:01.893 回答