私のレール4のアプリケーションではhtml
とhtml
とjs
の両方のリクエストに対してhtml
と応答したいと思います。リクエストがhtml
タイプの場合、レンダリングは正常に動作しますが、リクエストがjs
の場合、htmlファイルはレンダリングされません(コマンドラインではレンダリングされています)。シンクラックのリクエストと応答
要求を制限するシナリオがいくつかあり、スロットルコードがhtml POST
とjs POST
要求によってトリガーされるようになっています。
Rack::Attack.throttle(key, limit: from_config(key, :limit), period: from_config(key, :period)) do |req|
if req.path.ends_with?(from_config(key, :path).to_s) && from_config(key, :method) == req.env['REQUEST_METHOD']
### This is the snippet I try to change the req type with but not working
if req.media_type == 'application/javascript'
req.media_type = 'text/html'
end
##### till here
req.ip
end
end
これは私がレンダリングしようとしているものです。ご覧のとおり、これはhtml
です。
Rack::Attack.throttled_response = lambda do |env|
[429, {}, [ActionView::Base.new.render(file: 'public/429.html', content_type: 'text/html')]]
end
どうすればよいですか?
UPDATE
これは私の最新バージョンであるが、要求CONTENT_TYPEチェックする方法を見つけ出すことはできません。
Rack::Attack.throttled_response = lambda do |env|
retry_after = (env['rack.attack.match_data'] || {})[10]
if env['rack.attack.content_type'] == 'text/html'
[429, {'Retry-After' => retry_after.to_s}, [ActionView::Base.new.render(file: 'public/429.html', content_type: 'text/html')]]
elsif env['rack.attack.content_type'] == 'application/javascript'
[429, {'Retry-After' => retry_after.to_s}, window.location.href = '/429.html']
end
end
ドキュメント:https://github.com/kickstarter/rack-attack
なぜあなたはそれをしたいですか?カスタムのMIMEタイプを作成したり、ヘッダーを使用して、既存のMIMEタイプの1つを混乱させるのではなく、XHR要求かどうかを確認する方が理にかなっています。 – max
ほとんどのブラウザは、リクエストが 'accept:text/html'以外のものであれば、レスポンスをHTMLとして表示しません。 – max
最大、あなたはそれを私に示すことができますか?私は、これが何らかのアクションの限界を超えた場合にのみ、これが起こるので、なぜこれが何かを混乱させる理由はわかりません。 –