LoginSignup
4
4

More than 3 years have passed since last update.

Heroku×CloudflareでHTTP Origin Header didn't match request.base_urlというエラーをrailsのmiddlewareで解決する。

Last updated at Posted at 2020-09-05

背景

Herokuアプリを無料でSSL化する際に、Cloudflareと連携させる方法がある。
詳細は以下を参照。
https://qiita.com/serinuntius/items/f7f08b2221f5ad068f5d

Cloudflareはフレキシブルモードで、クライアントとhttps、herokuとはhttpで通信をしてくれる。

その状態で次のエラーになることがある。
HTTP Origin header didn't match request.base_url

詳しくは分からないが、httpとhttps、2つの通信形態を混在させていることが原因っぽいエラーだ。

類似記事

お金を払ってherokuをSSL化すれば、解決する。herokuとcloudflareの通信もSSL化すればいいという作戦。詳しくはこちら (だったらcloudflareいらなくね?)。
https://qiita.com/mzmt/items/2b44e82f2aa90ebf4623
[Heroku×CloudflareでHTTP Origin Header didn't match request.base_urlというエラーがでる]

お金をかけずに解決するには

こちらで議論されていた。
https://stackoverflow.com/questions/55109859/trestle-http-origin-header-https-didnt-match-request-base-url-http

1 railsプロジェクト直下のlibディレクトリにCloudflareProxy.rbを作成

/lib/CloudflareProxy.rb
# frozen_string_literal: true

require 'json'

class CloudflareProxy
  def initialize(app)
    @app = app
  end

  def call(env)
    return @app.call(env) unless env['HTTP_CF_VISITOR']

    env['HTTP_X_FORWARDED_PROTO'] = JSON.parse(env['HTTP_CF_VISITOR'])['scheme']
    @app.call(env)
  end
end

2 config/application.rb に以下の2行を、それっぽい位置に追加

require './lib/CloudflareProxy'

config.middleware.use CloudflareProxy

終了

herokuにpushして動作を確認する。
この界隈を漁ってたらRackとかいうインターフェイスに出会った。勉強不足を痛感させられるエラーでした。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4