Rails - 如何从http://example.com重定向到https://www.example.com

时间:2010-12-01 21:10:34

标签: ruby-on-rails ruby-on-rails-3 dns heroku

我正在学习如何清理应用的网址。我的应用程序由Heroku上的Rails 3提供支持。

所需的网址为https://www.example.comite.com

我想将与上述不同的所有网址重定向到该网址。这是Rails还是DNS?

错误的网址:

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

如果有任何内容落后,例如http://www.example.comite.com/photo/1,网址将被重定向:https://www.example.comite.com/photo/1

6 个答案:

答案 0 :(得分:47)

作为user2100689's answer的扩展,在Rails 3+中,您可以在 config / environments / 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

答案 1 :(得分:18)

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 => "" }

答案 2 :(得分:7)

因为这是Heroku,所以你不能使用apache或nginx配置。你可以做的是在你的ApplicationController中放一个before_filter,假设你有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

使用设计时,您可能还需要稍微改变路线,但我怀疑是这样 就像我们这样做的方式所以我不会在这里详细介绍这些细节,并且我修改了代码 以上是为了避免这种并发症。

快乐的黑客攻击。

答案 3 :(得分:7)

Rails 3.1.0及更高版本具有force_ssl,这是一种控制器方法,将在非开发环境中重定向到https。

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

将它放在要重定向的每个控制器中,或者更好的是,将它放在ApplicationController中:

应用程序/控制器/ application.rb中:

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

这总是包含在您的应用中是一件好事(当然,您必须获得证书)。 HTTPS无处不在!

答案 4 :(得分:7)

您始终可以将其投放到production.rb ... config.use_ssl = true

答案 5 :(得分:-5)

在您的vhosts文件中执行此操作。

设置SSL虚拟主机。

在标准端口80虚拟主机中。将其添加到配置:

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

这会将所有端口80请求转发到https。