42 votes

Rails 3 routage SSL redirige de https vers http

Cette question se rapporte à cette SORTE de question et de réponse (rails-3-ssl autodérision ) où son pour gérer le ssl dans rails 3, utiliser les routes.rb et routes comme:

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 }

Mon problème est que les liens utiliser des chemins relatifs(je pense que c'est le bon terme) et une fois que je suis sur une page https tous les autres liens vers d'autres pages sur le site, puis utiliser le protocole https.

1) quel est le meilleur moyen de revenir à http pour les pages https n'est pas nécessaire? Dois-je configurer les redirections pour tous(j'espère note) ou est-il une meilleure façon. Serait le redirige être comme ceci:

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

2) Si la renvoie à http sont nécessaires, comment dois-je traiter un cas où je veux toutes les méthodes http, sauf un? ie foos(/*path), tous les foos méthodes. Mais disons que je voulais foos/upload_foos pour utiliser ssl. Je sais comment l'exigent

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

mais si je l'ai mis dans la redirection http vers la foos chemin de ce qui se passe en https upload_foos?

43voto

Samuel Points 21085

Si vous souhaitez que tous vos liens à être en mesure de basculer entre http et https, vous devez cesser d'utiliser le _path d'aide et de basculer en _url des aides.

Après cela, à l'aide d'un champ avec le paramètre protocole forcées et le protocole de contrainte rend l'url de basculer automatiquement.

les itinéraires.rb
scope :protocol => 'https://', :constraints => { :protocol => 'https://' } do
  resources :sessions
end

resources :gizmos

Et maintenant, à votre point de vue:

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

Modifier

Cela ne résout pas les url qui remontent à l'adresse http lorsque vous êtes en https. Pour corriger cela, vous devez substituer url_for.

Dans un helper

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

Ceci permettra de définir le protocole "http", sauf si elle a été explicitement définie (les itinéraires ou lors de l'appel à l'aide).

0voto

Matt Points 2617

C'était il y a longtemps et je suis sûr qu'il peut être amélioré, mais de retour sur une version ancienne de rails, j'ai eu ce code dans l'application du contrôleur. Pas sûr que c'est encore valable pour Rails 3, mais il peut être d'un peu d'aide:

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

L' USE_EXPLICIT_HOST_IN_ALL_LINKS a certains globale de l'option de configuration, mais vous pouvez l'ignorer.

Dans chaque contrôleur requis https, j'ajouterais before_filter :require_ssl et d'ajouter que le nom du contrôleur et de ses méthodes d' SECURE_ACTIONS. C'est probablement ce qui peut être amélioré en passant les noms d'action à l'avant du filtre, ou quelque chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X