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?
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.rbscope :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
.
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).
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ś.
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