Rails 3 SSL routing przekierowuje z https na http

To pytanie odnosi się do tego więc pytanie i odpowiedź (rails-3-ssl-deprecation ) gdzie its sugeruje obsługę ssl w rails 3 przy użyciu tras.rb i trasy jak:

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 }

Mój problem polega na tym, że linki używają ścieżek względnych (myślę, że to poprawny termin), a gdy jestem na stronie https, wszystkie inne linki do innych stron w witrynie używają https.

1) Jaki jest najlepszy sposób na powrót do http dla stron, w których https nie jest wymagany? Czy muszę ustawiać przekierowania dla wszystkie (mam nadzieję, że uwaga) lub jest lepszy sposób. Czy przekierowania będą takie:

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

2) Jeśli wymagane są przekierowania z powrotem do http, jak mam załatwić sprawę, w której chcę, aby wszystkie metody były http z wyjątkiem jednej? ie foos (/*path) będzie dla wszystkich metod foos. Ale powiedzmy, że chciałem foos / upload_foos używać ssl. Wiem, jak tego wymagać

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

Ale jeśli umieszczę przekierowanie http do ścieżki foos, co stanie się z HTTPS upload_foos?

Author: Community, 2010-10-22

2 answers

Jeśli chcesz, aby wszystkie twoje linki mogły przełączać się między http i https, musisz przestać używać helpera _path i przełączyć się na helpery _url.

Następnie użycie zakresu z parametrem forced i protocol constraint powoduje automatyczne przełączanie adresów URL.

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

resources :gizmos

A teraz w Twoich poglądach:

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

Edytuj

To nie naprawia adresów URL, które wracają do http, gdy jesteś w https. Aby to naprawić, musisz nadpisać url_for.

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

To ustawi protokół na 'http', chyba że został jawnie ustawiony (w trasach lub podczas wywoływania helpera).

 42
Author: Samuel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-26 05:21:39

To było dawno temu i jestem pewien, że można to poprawić, ale w starej wersji rails miałem ten kod w kontrolerze aplikacji. Nie jestem pewien, czy jest to nadal ważne dla Rails 3, ale może to być pomocne:

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 była jakąś globalną opcją konfiguracji, ale możesz to zignorować.

Do każdego kontrolera wymagającego https dodałbym before_filter :require_ssl i nazwę kontrolera oraz jego metody do SECURE_ACTIONS. Prawdopodobnie można to poprawić, przekazując nazwy akcji przed filtr, czy coś.

 0
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-22 11:30:57