【问题标题】:Change protocol to https in all rails helpers在所有 Rails 助手中将协议更改为 https
【发布时间】:2012-03-18 08:03:18
【问题描述】:

Rails 3.1+ 我希望我的 url 助手使用 https 协议,而不必在我调用的每个助手中指定它。 在四处搜索后,我发现了各种方法,但都没有奏效,例如:

 ROUTES_PROTOCOL = (ENV["RAILS_ENV"] =~ /development/ ? 'http://' : 'https://')

scope :protocol => ROUTES_PROTOCOL, :path => "/app" do

如何做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 https routes helpers


    【解决方案1】:

    对于 rails 5.2.0 RESTAPI 应用程序,以下工作:

    根据需要在每个环境文件中,即 config/environments/test.rb

      Rails.application.routes.default_url_options[:protocol] = 'https'
    
    

    控制器代码:

     Rails.application.routes.url_helpers.url_for(uploaded_file)
    

    【讨论】:

      【解决方案2】:

      在 Rails 5.1.4 中,我测试了以下场景:

      # in development.rb
      config.action_controller.default_url_options({:protocol => 'https'})
      config.action_controller.default_url_options(:protocol => 'https')
      # Does not work
      
      # in development.rb, outside config block
      Rails.application.routes.default_url_options[:protocol] = 'https'
      # Does not work, but works under console
      
      # in routes.rb
      Rails.application.routes.draw do
        default_url_options protocol: :https
      # Does not work, but works under console
      
      # in ApplicationController
      def default_url_options(options={})
        { secure: true }
      end
      # Does not work
      
      # in ApplicationController
      def default_url_options
        { protocol: :https }
      end
      # Works in browser, but does not work under console
      
      # in development.rb
      config.action_controller.default_url_options= {:protocol => 'https'}
      # Works in browser, but does not work under console
      

      【讨论】:

      • 你弄明白了吗
      【解决方案3】:

      我尝试了上面所有的答案,只有这个对我有用:

      config/environments/production.rb

      Rails.application.routes.default_url_options[:protocol] = 'https'
      

      ruby 2.1.4p265(2014-10-27 修订版 48166)[x86_64-linux] Rails 3.2.22.5

      【讨论】:

        【解决方案4】:

        您可以将此代码添加到ApplicationController

          def default_url_options(options={})
            options.merge(protocol: :https)
          end
        

        您也可以查看Getting Rails URL helpers to automatically output https urls

        【讨论】:

          【解决方案5】:

          如果您使用的是 Rails 4,则定义 ApplicationController#default_url_options 不起作用。 URL 选项现在在应用程序的路由配置中定义:

          Rails.application.routes.draw do
            default_url_options protocol: :https
          end
          

          【讨论】:

          • 我将以下内容放在我的 production.rb 文件中。 Rails.application.routes.default_url_options[:protocol] = 'https'
          • 仅适用于 Rails 5.1.4 的控制台。
          • 谢谢,它有效!
          【解决方案6】:

          如果您想在您的应用程序上强制使用 SSL,可以通过在您的 application.rb(或您的环境特定文件)中将 config.force_ssl 设置为 true 来完成。更多主题here

          编辑 好的,所以我没有找到足够的证据,但我认为您可以在应用程序控制器中覆盖default_url_options=(options={}),并在函数体中设置:protocol => :https。如果这对您的电子邮件不起作用,则必须通过添加 config.action_mailer.default_url_options 在您的环境配置中重复该过程。希望这样做!

          【讨论】:

          • 当请求协议为 http 时会导致重定向,但我希望在 url 帮助程序中使用 https,主要用于电子邮件中的链接。
          【解决方案7】:

          所以您希望它主要用于电子邮件中的链接?

          我认为这将适用于您的 production.rb、development.rb 或任何其他环境。

          config.action_mailer.default_url_options = {
            :host => 'yourwebsite.com',
            :protocol => 'https'
          }
          
          # Makes it possible to use image_tag in mails
          config.action_mailer.asset_host = "https://yourwebsite.com"
          

          【讨论】:

            【解决方案8】:

            在 Rails 3.2.1 中,默认情况下 force_ssl 为 true,让我们检查一下

            1. 打开 config/environments/production.rb 并搜索“config.force_ssl”

            config.force_ssl = true - 无需更改

            现在在 config/environments/development.rb - 不需要放置 config.force_ssl,它应该可以工作,因为您的服务器在本地运行。

            好的,这是另一个视图

            if !request.ssl?
              "https://" + request.host + request.request_uri
            elsif request.ssl?
              "http://" + request.host + request.request_uri
            end
            

            在 if else 和 ActionView::Helpers 的基础上在 helper 中添加 def, 如果你开始使用它,有一个 url_for 方法可能会得到你想要的。

            【讨论】:

            • 当请求协议为 http 时会导致重定向,但我希望在 url 帮助程序中使用 https,主要用于电子邮件中的链接。
            • @99miles - 我更改了答案,请检查,让我知道这是否适合您。
            【解决方案9】:

            无论你想在哪个环境下使用 ssl (https://),只要在 config/environments 的配置文件中添加此配置行即可:

            YOURAPPNAME::Application.configure do
            
              # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
              config.force_ssl = true
            end
            

            【讨论】:

            • 当请求协议为 http 时会导致重定向,但我希望在 url 帮助程序中使用 https,主要用于电子邮件中的链接。
            猜你喜欢
            • 1970-01-01
            • 2015-02-14
            • 2013-09-13
            • 2021-12-14
            • 1970-01-01
            • 1970-01-01
            • 2012-09-23
            • 2018-03-28
            • 1970-01-01
            相关资源
            最近更新 更多