Rails 3 SSL路由重定向从https到http

Dan*_*iel 42 ruby-on-rails ruby-on-rails-3

这个问题与这个SO问题和答案(rails-3-ssl-deprecation)有关 ,它建议使用routes.rb和路由来处理rails 3中的ssl:

resources :sessions, :constraints => { :protocol => "https" }

# Redirect /foos and anything starting with /foos/ to https.
match "foos(/*path)", :to => redirect { |_, request|  "https://" + request.host_with_port + request.fullpath }
Run Code Online (Sandbox Code Playgroud)

我的问题是链接使用相对路径(我认为这是正确的术语),一旦我在https页面上,所有其他链接到网站上的其他页面然后使用https.

1)对于不需要https的页面,回到http的最佳方法是什么?我是否必须为所有这些设置重定向(我希望注意)或者有更好的方法.重定向会是这样的:

match "foos(/*path)", :to => redirect { |_, request|  "http://" + request.host_with_port + request.fullpath }
Run Code Online (Sandbox Code Playgroud)

2)如果需要重定向回http,我该如何处理我希望所有方法都是http的情况除外?即foos(/*path)适用于所有foos方法.但是说我想要foos/upload_foos来使用ssl.我知道如何要求它

scope :constraints => { :protocol => "https" } do
  match 'upload_foos' => 'foos#upload_foos', :via => :post, :as => :upload_foos 
end
Run Code Online (Sandbox Code Playgroud)

但是,如果我将http重定向放入foos路径,那么https upload_foos会发生什么?

Sam*_*uel 43

如果您希望所有链接都能够在http和https之间切换,则必须停止使用_path帮助程序并切换到_url帮助程序.

之后,使用带有协议参数强制和协议约束的作用域使URL自动切换.

的routes.rb
scope :protocol => 'https://', :constraints => { :protocol => 'https://' } do
  resources :sessions
end

resources :gizmos
Run Code Online (Sandbox Code Playgroud)

现在在你的观点中:

<%= sessions_url # => https://..../sessions %>
<%= gizmos_url   # => http://..../gizmos %>
Run Code Online (Sandbox Code Playgroud)

编辑

当您使用https时,这不会修复返回http的网址.要解决此问题,您需要覆盖url_for.

在任何帮手
module ApplicationHelper
  def url_for(options = nil)
    if Hash === options
      options[:protocol] ||= 'http'
    end
    super(options)
  end
end
Run Code Online (Sandbox Code Playgroud)

除非已明确设置(在路由中或调用帮助程序时),否则这会将协议设置为"http".