日常

ケ・セラ・セラ

rails force_ssl 関連

このように書くと https に強制される。

config/environments/production.rb

config.force_ssl = true

コントローラ個別に設定したい場合には、上記のように環境ごとのファイルには記載せず、よくこんな風にする。

class SampleController < ApplicationController
  force_ssl if: :ssl_configured?

  def index
  end
end

class ApplicationController < ActionController::Base

  private

    def ssl_configured?
      !Rails.env.development?
    end
end

テストでも HTTPS としてアクセスする必要があるのでこの点は注意。

describe SampleController, :type => :controller do
  before do 
    request.env[&quot;HTTPS&quot;] = &quot;on&quot;
  end

  describe &quot;foobar&quot; do
  end
end

上では request.env[&quot;HTTPS&quot;] = &quot;on&quot; としているが、どういうときに ssl request なのか? というのは、こちらの記事が詳しかった。

if @env[HTTPS] == 'on'
  'https'
elsif @env[HTTP_X_FORWARDED_SSL] == 'on'
  'https'
elsif @env[HTTP_X_FORWARDED_SCHEME]
  @env[HTTP_X_FORWARDED_SCHEME]
elsif @env[HTTP_X_FORWARDED_PROTO]
  @env[HTTP_X_FORWARDED_PROTO].split(',')[0]
else
  @env[&quot;rack.url_scheme&quot;]
end