在所有rails帮助程序中将协议更改为https

时间:2012-02-28 20:06:44

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

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

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

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

如何做到这一点?

9 个答案:

答案 0 :(得分:14)

所以你想要它主要用于电子邮件中的链接吗?

我认为这可以在你的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"

答案 1 :(得分:13)

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

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

答案 2 :(得分:5)

在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 :(得分:2)

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

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

答案 4 :(得分:1)

您可以将此代码添加到ApplicationController

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

您还可以结帐Getting Rails URL helpers to automatically output https urls

答案 5 :(得分:1)

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

配置/环境/ 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

答案 6 :(得分:0)

无论您想使用哪个环境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

答案 7 :(得分:0)

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

  1. 打开config / environments / production.rb并搜索“config.force_ssl”
  2. 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中添加def in helper base, 如果你开始使用url_for方法可能会得到你想要的东西。

答案 8 :(得分:0)

对于Rails 5.2.0 RESTAPI App,以下工作有效:

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

LIKE 'DATASERIES_yyy'

控制器代码:

iv = random_iv()


des = DES.new(key)

plaintext1=""
#convert it into binary
plaintext1=bin(int.from_bytes(arr[0].encode(), 'big'))[2:]

y = fn.xor(plaintext1 ,iv)
y1='0'+'b'+y

y= int(y1, 2)
#y is the string output of xoring plaintext1 with the IV 
y= y.to_bytes((y.bit_length() + 7) // 8, 'big').decode()   

encrypted_blocks=[]

# arr is the array of the original blocks of the msg.
for i in range (1, len(arr)):
    c = des.encrypt(y)
    print(c)
    encrypted_blocks.append(c)
    ### stuck here ### 
    #### don't know how to work with c in that format ######