2010-12-01 39 views
31

我正在學習如何清理我的應用程序的URL。我的應用程序由Heroku上的Rails 3支持。Rails - 如何將http://example.com重定向到https://www.example.com

所需的URL是https://www.example.comite.com

我想不同的是以上所有的網址重定向到URL。這是一個Rails的東西或DNS?

不良網址:

https://example.comite.com 
http://www.example.comite.com 
http://example.comite.com 

如果有什麼尾隨,如http://www.example.comite.com/photo/1的URL與路徑被重定向:https://www.example.comite.com/photo/1

回答

17

DNS記錄無法定義域的協議,因此您無法通過DNS將http://重定向到https://。通過Web服務器配置來完成它不是可移植的,很難做到,容易出錯並且只是過時。這是由Rails路由器最好處理的工作。

# beginning of routes.rb 
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :protocol => "http://" } 
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :subdomain => "" } 
+0

這是有效的,但是你需要離開A記錄嗎?我假設你可以通過DNS將`mysite.com`重定向到`http:// www.mysite.com`,然後一旦它打到你的rails應用程序,它就會使用你的路由約束重定向到https。但是,使用我的DNS重定向`http:// mysite.com`按預期方式重定向,但是`https:// mysite.com`不會(並且從未命中我的rails服務器以使路由限制生效)。我現在已經恢復了A記錄,但只是想知道你是否知道爲什麼DNS重定向不適用於`https:// mysite.com`。 – 2012-06-13 23:21:08

+0

沒有什麼可以在DNS端做的。正如我所說的,DNS與協議無關。您可以將名稱重定向到另一個,但不是協議。它甚至沒有傳輸到DNS服務器。您的瀏覽器詢問「mysite.com」的IP地址不是「http:// mysite.com」,它會得到類似「REDIRECT www.mysite.com」的回覆,而不是「REDIRECT http:// www.mysite.com」 – edgerunner 2012-06-14 12:51:07

+0

我無法通過在路線中添加上述規則從「https://example.com」重定向到「https://www.example.com」 – Shrinivas 2017-11-15 10:38:23

-5

做在你的虛擬主機文件。

設置SSL虛擬主機。

在您的標準端口80虛擬主機。添加到配置:

Redirect permanent/https://www.mysite.com 

這將轉發所有端口80請求到https。

+4

他用的Heroku並且無法像這樣訪問Web服務器配置。 – theandym 2010-12-02 15:56:18

7

因爲這是Heroku,所以不能使用apache或nginx配置。你可以做的是把的before_filter在你的ApplicationController,假設你有3個或多個控制器就像 這些下面,當然,他們會在不同的文件中

class ApplicationController < ActionController::Base 
    def redirect_https   
     redirect_to :protocol => "https://" unless request.ssl? 
     return true 
    end 
    before_filter :redirect_https 
end 
class TypicalController < ApplicationController 
    def blah 
    end 
end 
class HomePageController < ApplicationController 
    skip_before_filter :redirect_https 
end 

您可能還需要擺弄你的路線有點當使用設計,但我懷疑這是 就像我們這樣做,所以我不會在這裏進入這些細節,我已經修改了上面的代碼 以避免這種複雜。

快樂的黑客攻擊。

+0

這感覺就像是正確的路要走,但沒有回答一個關鍵點:你如何從`http:// mysite.com`過渡到`https:// www.mysite.com`? (回答基本相同的問題http://stackoverflow.com/questions/9027916/redirecting-from-http-mysite-com-to-https-secure-mysite-com並獲得雙倍積分!) – 2012-01-27 06:38:23

7

Rails 3.1.0及更高版本有force_ssl,這是一種控制器方法,將針對非開發環境重定向到https。

http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html

將其放置在您要重定向,或者更好,把它放到你的ApplicationController每個控制器:

的app/controllers/application.rb中:

class ApplicationController < ActionController::Base 
    # ... 
    force_ssl 
    # ... 
end 

這總是包含在您的應用程序中是一件好事(當然,您必須獲得證書)。無處不在的HTTPS!

8

你可以隨時把它扔到你的production.rb中...config.use_ssl = true

40

進行了擴展,user2100689's answer,在Rails的3+您可以在配置/環境/ production.rb使用config.force_ssl = true

線正好可以註釋掉如下

# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 
config.force_ssl = true 
相關問題