###背景
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
を作成
# 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
とかいうインターフェイスに出会った。勉強不足を痛感させられるエラーでした。