Rails 8で発生する406エラーの原因と対処法まとめ
こんにちは。
現役看護師で、幼い子供を育てつつ、無謀かもしれませんがエンジニアを目指している母親です。
Rails 8以降では、Chromeのデバイスモードやローカル環境のアクセスなどで「406 Not Acceptable」エラーが発生するケースがあります。
本記事では、エラーの原因と、その対処法を2つを備忘録として再度載せます。
どんなエラーが表示されたのか
Deviseでログインページ(例:/users/sign_in
)にアクセスしたときに、
Rendering public/406-unsupported-browser.html Completed 406 Not Acceptable
と表示されて、ページが表示されないことがある。
原因
Rails 8(および Rails 7.2)から追加された以下の設定:
# app/controllers/application_controller.rb
allow_browser versions: :modern
このallow_browser
は、古いブラウザやUser-Agentが不明なアクセスをブロックする機能。
ブロックされる主なケース
以下のような場合、User-Agentが "modern" でないと判断され、Rails 8 では406エラー(Not Acceptable)が発生。
- Chrome DevTools で「モバイル表示」にしたとき
- IPv6やローカル環境など、User-Agentが不明とみなされたとき
特に以下のブラウザバージョンは「modern」の基準を満たさず、ブロックされる可能性がありそう。
デバイス例 | ブラウザバージョン |
---|---|
iPhone 14 Pro Max | Safari 16.6 |
Pixel 7 | Chrome 116 |
Galaxy S20 Ultra | Chrome 116 |
対処法1:ApplicationController側で制限を外す(開発中のみ)
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
# allow_browser versions: :modern ← これをコメントアウトする
end
または環境ごとに条件分岐させて本番環境のみ有効にする方法もあるようです。
if Rails.env.production?
allow_browser versions: :modern
end
メリット
- 本番では制限を有効にできる
デメリット
- コメントアウトを忘れて本番環境に出すと古いブラウザも許可してしまう
対処法2:development.rb
でUser-Agentチェックを無効化
# config/environments/development.rb
Rails.application.configure do
# 末尾に追加
config.action_dispatch.allow_browser = ->(user_agent) { true }
end
この設定を入れると、開発環境で常にすべてのブラウザを許可できるようです。
設定後はサーバー再起動が必要になります。
# サーバー停止後に再起動
bin/dev
# または
rails server
おわりに
今回紹介した2つの対処法のどちらかを実施することで、開発中に発生する406エラーは解消される可能性がありそうです。
以前、対処法2:development.rb
で User-Agent チェックを無効化する方法のみを取っていましたが、他のやり方もあったので忘れないようにまとめました。