問題点
存在しないパスへアクセスがあった時に、ルート(/)へリダイレクトさせるルーティング設定をしている環境で、ActiveStorageを利用して画像ファイルを保存していたWEBアプリ上で画像が表示されなくなった。
config/routes.rb
# .
# .
# .
# 本番環境で、
# ルーティングが存在しないパスへアクセス(GET)があった場合に、
# ルート(/)へリダイレクトさせる
if Rails.env.production?
match "*path" , to: redirect('/'), via: 'get'
end
原因
ActiveStorageを利用して取得した画像ファイルのURLがリダイレクトの対象になっていた。
show.html.erb
<%# 画像ファイルを表示 %>
<%= image_tag @user.avatar %>
# HTMLには↓のURLが出力される
# /rails/active_storage/blobs/xxxxx--xxxxx/icon.png
解決策
ActiveStorageを利用して取得する画像ファイルのURLをリダイレクトの対象外にすることで解決した。
参考:Rails Router Catchall Picks Up ActiveStorage Routes · Issue #31228 · rails/rails
config/routes.rb
# .
# .
# .
# 本番環境で、
# ルーティングが存在しないパスへアクセス(GET)があった場合に、
# ルート(/)へリダイレクトさせる
get '*path', to: redirect('/'), constraints: lambda { |req|
# 'rails/active_storage'が含まれているパスはリダイレクト対象外にする
req.path.exclude? 'rails/active_storage'
}