복붙노트

[RUBY-ON-RAILS] https에서 http로 3 SSL 라우팅 리디렉션 레일

RUBY-ON-RAILS

https에서 http로 3 SSL 라우팅 리디렉션 레일

이 질문이 SO 질문과 답변 (레일 -3- SSL 비하에 관한 ) 여기서 그와 같은 routes.rb 및 경로를 사용하여 레일 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 }

내 문제는 링크가 상대 경로를 사용 (내가 올바른 용어 먹으 렴 생각)와 내가 HTTPS 페이지에있어 일단 사이트의 다른 페이지에있는 다른 모든 링크가 다음 https를 사용한다는 것입니다.

1) 무슨 HTTP 페이지로 다시 얻을 수있는 가장 좋은 방법은 어디에 필요하지 않습니다 HTTPS? 더 나은 방법이 내가 그들 모두 (내가 메모를 희망한다) 또는 대한 설정 리디렉션해야합니까. 리디렉션은 다음과 같이 될 것이다 :

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

리디렉션이 필요한 HTTP에 백업하는 경우 2) 어떻게 내가 모든 방법을 제외한 HTTP 될하고자하는 경우를 처리합니까? 즉, FOOS (/ * 경로)는 모든 FOOS 방법이 될 것입니다. 하지만 SSL 사용에 FOOS / upload_foos를 원 말한다. 나는 그것을 필요로하는 방법을 알고

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

하지만 HTTPS upload_foos에 어떻게됩니까 FOOS 경로에 HTTP 리디렉션에 넣으면?

해결법

  1. ==============================

    1.귀하의 모든 링크가 HTTP와 HTTPS 사이를 전환 할 수있게하려면, 당신은 _url 헬퍼에 _path 도우미와 스위치를 사용을 중지해야합니다.

    귀하의 모든 링크가 HTTP와 HTTPS 사이를 전환 할 수있게하려면, 당신은 _url 헬퍼에 _path 도우미와 스위치를 사용을 중지해야합니다.

    그 후, 프로토콜 매개 변수 범위를 사용하여 강제 및 프로토콜 제약 URL이 자동으로 전환합니다.

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

    이제 귀하의 의견에 :

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

    이것은 당신이 HTTPS에있을 때 HTTP로 돌아가 URL을 수정하지 않습니다. 당신이 url_for를 오버라이드 (override) 할 필요가 해결합니다.

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

    이것은 'HTTP'(도우미를 호출 할 때 경로 나)이 명시 적으로 설정하지 않는 한에 프로토콜을 설정합니다.

  2. ==============================

    2.이것은 오래 전이었고, 나는 확실히 그것을 향상시킬 수있어,하지만 다시 레일의 일부 이전 버전에 나는 응용 프로그램 컨트롤러에서이 코드를했다. 확실하지이 여전히 레일 3 유효하지만, 약간의 도움이 될 수 있습니다 :

    이것은 오래 전이었고, 나는 확실히 그것을 향상시킬 수있어,하지만 다시 레일의 일부 이전 버전에 나는 응용 프로그램 컨트롤러에서이 코드를했다. 확실하지이 여전히 레일 3 유효하지만, 약간의 도움이 될 수 있습니다 :

    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은 일부 글로벌 구성 옵션했지만,이 무시할 수 있습니다.

    HTTPS에 필요한 각 컨트롤러에서 나는 before_filter 추가 할 것 : require_ssl와 해당 컨트롤러 이름과 SECURE_ACTIONS에 메서드를 추가합니다. 이것은 아마도 필터, 또는 무언가 전에에 작업 이름을 전달하여 개선 될 수있다.

  3. from https://stackoverflow.com/questions/3993651/rails-3-ssl-routing-redirects-from-https-to-http by cc-by-sa and MIT license