Rails 3 Il routing SSL reindirizza da https a http

Questa domanda si riferisce a questa domanda e risposta SO (rails-3-ssl-deprecation) in cui si suggerisce di gestire ssl in rails 3 usando routes.rb e percorsi come:

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 } 

Il mio problema è che i link usano percorsi relativi (penso che sia il termine corretto) e una volta che sono su una pagina https tutti gli altri link ad altre pagine del sito usano https.

1) Qual è il modo migliore per tornare a http per le pagine in cui non è richiesto https? Devo impostare reindirizzamenti per tutti loro (spero appunto) o c’è un modo migliore. I reindirizzamenti sarebbero così:

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

2) Se sono necessari reindirizzamenti verso http, come faccio a gestire un caso in cui voglio che tutti i metodi siano http tranne uno? per esempio foos (/ * path) sarebbe per tutti i metodi foos. Ma diciamo che volevo foos / upload_foos per usare ssl. So come richiederlo

 scope :constraints => { :protocol => "https" } do match 'upload_foos' => 'foos#upload_foos', :via => :post, :as => :upload_foos end 

ma se inserisco il reindirizzamento http nel percorso foos, cosa succede a https upload_foos?

Se vuoi che tutti i link siano in grado di passare da http e https, devi smettere di usare l’helper _path e passare a _url helper.

Dopodiché, utilizzando un ambito con il parametro del protocollo forzato e il vincolo del protocollo, gli URL vengono automaticamente modificati.

routes.rb

 scope :protocol => 'https://', :constraints => { :protocol => 'https://' } do resources :sessions end resources :gizmos 

E ora nelle tue opinioni:

 <%= sessions_url # => https://..../sessions %> <%= gizmos_url # => http://..../gizmos %> 

modificare

Questo non risolve gli URL che tornano a http quando ti trovi in ​​https. Per risolvere il problema è necessario scavalcare url_for .

In ogni aiuto

 module ApplicationHelper def url_for(options = nil) if Hash === options options[:protocol] ||= 'http' end super(options) end end 

Questo imposterà il protocollo su ‘http’ a meno che non sia stato impostato esplicitamente (in route o quando si chiama l’helper).

Questo è stato molto tempo fa e sono sicuro che può essere migliorato, ma su alcune vecchie versioni di rotaie avevo questo codice nel controller dell’applicazione. Non sono sicuro che questo sia ancora valido per Rails 3, ma potrebbe essere di aiuto:

 private SECURE_ACTIONS = { :login => ["login", "login_customer", "remind_password", "add_customer", "add_or_login_customer"], :store => ["checkout", "save_order"], :order => ["show"] } # Called as a before_filter in controllers that have some https:// actions def require_ssl unless ENV['RAILS_ENV'] != 'production' or @request.ssl? redirect_to :protocol => 'https://', :action => action_name # we don't want to continue with the action, so return false from the filter return false end end def default_url_options(options) defaults = {} if USE_EXPLICIT_HOST_IN_ALL_LINKS # This will OVERRIDE only_path => true, not just set the default. options[:only_path] = false # Now set the default protocol appropriately: if actions = SECURE_ACTIONS[ (options[:controller] || controller_name).to_sym ] and actions.include? options[:action] defaults[:protocol] = 'https://' defaults[:host] = SECURE_SERVER if defined? SECURE_SERVER else defaults[:protocol] = 'http://' defaults[:host] = NON_SECURE_SERVER if defined? NON_SECURE_SERVER end end return defaults end 

USE_EXPLICIT_HOST_IN_ALL_LINKS era un’opzione di configurazione globale, ma puoi ignorarla.

In ogni controller che richiedeva https, aggiungevo before_filter :require_ssl e aggiungevo il nome del controller e i suoi metodi a SECURE_ACTIONS . Questo probabilmente può essere migliorato passando i nomi delle azioni al filtro precedente, o qualcosa del genere.