404ページのエラー表示をするには
404のエラーの時、独自のエラーページを表示するには以下のようにします。
viewsの中に「 error 」ディレクトリを作成し、「 404.erb 」のエラーページを作成します。
not_found do
status 404
erb :'errors/404'
end
また、「 not_found 」ではなくステータスコードの404を指定することもできます。
error 404 do
status 404
erb :'errors/404'
end
SinatraでRack::Csrfの例外をハンドリングする
CSRF対策のRack::Csrfは「 use Rack::Csrf, :raise => true 」と記述しただけでは、errorハンドラで例外を補足できません。
production環境ではCSRFチェックに引っかかるとステータスコードが403になり、真っ白な画面が表示されます。
そのため、以下のようなコードを追加します。
use Rack::Csrf, :raise => true, :skip => ['POST:.*', 'PUT:.*', 'DELETE:.*']
# Sinatraの例外表示処理を無効
set :show_exceptions, false
def check_csrf
raise Rack::Csrf::InvalidCsrfToken unless params[Rack::Csrf.csrf_field] == session['csrf.token']
end
before do
check_csrf if ['POST', 'PUT', 'DELETE'].include?(env['REQUEST_METHOD'])
end
error Rack::Csrf::InvalidCsrfToken do
erb :"errors/500"
end
特定のページだけCSRFチェックしたい場合は、beforeブロック内のcheck_csrfを削除し、各ルーティングのメソッドに check_csrfメソッドを設定します。
post '/foo' do
check_csrf
end