【问题标题】:Rails - How to Redirect from http://example.com to https://www.example.comRails - 如何从 http://example.com 重定向到 https://www.example.com
【发布时间】:2011-05-18 18:26:45
【问题描述】:

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

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

我想将所有与上述不同的 URL 重定向到该 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

【问题讨论】:

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


    【解决方案1】:

    作为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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这行得通,但是您需要保留 A 记录吗?我假设您可以通过 DNS 将 mysite.com 重定向到 http://www.mysite.com,然后一旦它到达您的 Rails 应用程序,它将使用您的路由约束重定向到 https。但是,我的 DNS 重定向 http://mysite.com 按预期重定向,但 https://mysite.com 没有(并且永远不会访问我的 Rails 服务器以使路由约束生效)。我现在已经恢复到拥有 A 记录,但只是想知道您是否知道为什么 DNS 重定向对 https://mysite.com 不起作用。
      • 在 DNS 端您无能为力。正如我所说,DNS 与协议无关。您可以将名称重定向到另一个名称,但不能重定向协议。它甚至不会传输到 DNS 服务器。您的浏览器询问mysite.com 而不是http://mysite.com 的IP 地址,它会得到类似REDIRECT www.mysite.com 而不是REDIRECT http://www.mysite.com 的回复
      • 我无法通过在路由中添加上述规则从“example.com”重定向到“example.com
      • @Shrinivas 除非您将它们放在routes.rb开头,否则它们可能无法工作
      【解决方案3】:

      因为这是 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
      

      在使用 devise 时,您可能还需要稍微调整一下路线,但我怀疑那是 就像我们做的那样,所以我不会在这里讨论这些细节,我已经修改了代码 避免这种并发症。

      黑客愉快。

      【讨论】:

      • 这感觉是正确的方法,但没有回答一个关键点:您如何从http://mysite.com 过渡到https://www.mysite.com? (在stackoverflow.com/questions/9027916/… 中回答基本相同的问题并获得双倍积分!)
      【解决方案4】:

      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 无处不在!

      【讨论】:

      • 这是否可以防止 SSL 剥离?
      • 我相信这确实可以防止 sslstrip 类型的攻击。 Rails 将通过始终重定向到相应的 HTTPS URL 来拒绝服务非 SSL 请求。如果 sslstrip 改变了重定向的协议,Rails 将简单地再次重定向到 HTTPS。
      • 感谢@Robin_Daughtery
      • @RobinDaugherty 小心,如果有 MITM 攻击,那么会话 cookie 将在重定向回 https 发生之前泄露。这意味着更高级的 sslstrip 将 pwn 您的网站,并使公共 wifi(和欺骗性 wifi)在使用您的应用程序时非常危险。为了防止 cookie 泄漏,您需要启用 config.use_ssl = true
      • force_ssl is the setting that enables secure cookies. 我找不到对 use_ssl 设置 in the Rails codebase 的引用,在 Google 中也找不到。
      【解决方案5】:

      您可以随时将其放入您的 production.rb...config.use_ssl = true

      【讨论】:

      • 使用 Rails 5(可能还有旧版本),use_ssl 将无能为力。 force_ssl 是必须设置的选项。
      【解决方案6】:

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

      设置 SSL 虚拟主机。

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

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

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

      【讨论】:

      • 他正在使用 Heroku,并且无法访问这样的 Web 服务器配置。
      猜你喜欢
      • 2014-10-02
      • 2020-09-24
      • 1970-01-01
      • 2016-01-16
      • 2017-12-21
      • 2011-07-06
      • 2011-08-12
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多