2012-05-15 26 views
2

我正在運行一個Rails 3.1.4應用程序,它需要一些頁面使用force_ssl,但其他的我不想使用SSL。是否有與force_ssl相反的內容,比如force_http?問題是我有一些不需要SSL的頁面,並且它們包含了我無法使用https進行瀏覽的元素(因此用戶從瀏覽器中獲得了不安全的錯誤)。Rails中的Force_SSL的對面?

會發生什麼情況是,當有人轉到force_ssl頁面時,它可以正常工作,但當他們轉到非force_ssl的其他頁面時,他們會從瀏覽器收到不安全的頁面錯誤,因爲https仍然存在。因此,我想強制頁面,我不能使元素HTTPS避免使用SSL(即強制它回http)。

預先感謝您。

回答

5

好吧,我發現似乎爲我工作的方式:所以只有那些2分的動作將被調用通過SSL

force_ssl :only => [:new, :create] 

:我加入這個

在我的會話控制器。現在,用戶成功登錄後,該頁面將重定向到非SSL連接。

至於強制頁面爲非SSL,請嘗試以下問題:Rails 3.1 Force Regular HTTP,請使用before_filter查找Joost的答案。

這是他張貼:

class ApplicationController < ActionController::Base 
    before_filter do 
    if request.ssl && Rails.env.production? 
     redirect_to :protocol => 'http://', :status => :moved_permanently 
    end 
    end 
end 

免責聲明:上面的代碼是不是我的,我複製它從鏈接的問題,只是把它在這裏爲了方便。請訪問上面的鏈接以查看原始上下文。

此外,關於強制非SSL,我不確定這是一個好主意。如果用戶請求SSL連接並且您擁有證書,爲什麼不把它們交給他們?我同意SSL確實給瀏覽器帶來了更大的壓力,但有些人喜歡一直在瀏覽SSL。如果你有一些不能通過SSL的代碼,那麼這是強制非SSL的有效理由。

乾杯。

+0

我試圖使用它,但它迫使我改變request.ssl來添加一個問號(正如有人在其他頁面上回答了這個問題)。當我去到我的force_ssl頁面時,我收到一個錯誤,說有太多的重定向 – yellowreign

+0

太多的重定向意味着它被困在一個循環中。如果你離開before_filter會發生什麼?即使沒有請求,所有頁面都通過SSL提供服務嗎? – kakubei

+0

不,默認情況下不是。會發生什麼情況是有人轉到https(force_ssl)頁面,並且通過鏈接訪問的所有後續頁面都採用https。我決定你是正確的讓這些頁面在https中呈現而不是強制http – yellowreign

0

得到這個工作沒有循環。除非它發生在瀏覽器中,我不知道。

before_filter do 
    unless params[:controller] == 'whatever_controller_name_you_are_serving_https_to' 
    if request.ssl? && Rails.env.production? 
     redirect_to :protocol => 'http://', :status => :moved_permanently 
    end 
    end 
end 
0

假設(希望)您已升級到Rails的支持的版本,這是一個簡單的方法來實現默認的非SSL除非force_ssl聲明。這是在ActiveSupport::Concern形式:

module ForceNoSSL 
    extend ActiveSupport::Concern 

    ACTION_OPTIONS = [:only, :except, :if, :unless] 

    def force_no_ssl_redirect 
    if request.ssl? 
     options = { 
     :protocol => 'http://', 
     :host  => request.host, 
     :path  => request.fullpath, 
     :status => :moved_permanently 
     } 

     redirect_to ActionDispatch::Http::URL.url_for(options) 
    end 
    end 

    class_methods do 
    def force_ssl(options = {}) 
     super 

     action_options = options.slice(*ACTION_OPTIONS) 
     skip_before_action :force_no_ssl_redirect, **action_options 
    end 

    def force_no_ssl 
     before_action :force_no_ssl_redirect 
    end 
    end 
end 

在你ApplicationController你那麼:

include ForceNoSSL 
force_no_ssl 

工作原理是,默認情況下所有行動將運行force_no_ssl_redirect回調。如果它已經是非ssl連接,則不會執行任何操作,否則請求將被重定向到http://

但是,如果您聲明瞭force_ssl,則將跳過force_no_ssl_redirect回調(僅限於由ACTION_OPTIONS指定的操作)。

您可以擴展此以允許force_no_ssl接受URL選項等等,就像force_ssl動作所做的那樣,但對於我的用例來說,這不是必需的。

P.S.很多此代碼來自ActionController::ForceSSL,因此請檢查以瞭解更多信息。

相關問題