概要
Docker に構築した Rails 6 で、 RSpec の request テストを実行したら、 response.status が 403 になりテストコードが通らなくなりました。
解決に半日以上使ってしまったので、原因と解決方法を残します。
環境
Rails 6.0.2
Docker
RSpec の実行方法
docker run --rm -v /hege/app:/app rails_app bundle exec rspec spec/requests
出ていたエラー
Blocked host: www.example.com
To allow requests to www.example.com, add the following to your environment configuration
テストコード内で p response を実行して確認しました。
原因
Rails6 で追加された DNS リバインディング攻撃防止機能
RSpec でテストを実行すると www.example.com というホスト名でテストが実行されます。
www.example.com が登録されていないホスト名だった為にブロックされたようです。
解決方法
アクセスを許可するドメインを Rails.application.config.hosts に追加します。
config/application.rb に、ドメインを追加しました。
module XXXXX
class Application < Rails::Application
# 略
config.hosts << '.example.com'
end
end
最後に
Rails 6 で ホスト名を指定していないとエラーになる事は知っていたのですが、 RSpec でも同様にエラーになるとは思ってもいませんでした。
最初はパーミッションの問題だと思いこみ、全然違う所を見ていました。
response を出力して読んでいれば半日も潰れる事はなかったです。
Rails からのメッセージをちゃんと読むべきでした。