0

在我的 rails 4 应用程序中,我想同时回复htmlforhtmljsrequest。在请求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

我应该怎么办?

更新

这是我的最新版本,但不知道如何检查请求内容类型:

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

4

1 回答 1

1

我同意@max。原则上,您不应使用 HTML 响应专门针对 JS 的请求。

但要回答这部分问题:

如何检查请求内容类型:

尝试检查这个:

req.env['HTTP_ACCEPT']

解释

  1. req 是一个子类的对象 Rack::Request
  2. Rack 预先 HTTP_添加到客户端的 HTTP 请求标头并将它们添加到env散列中。
  3. HTTP 客户端可以在标头中指示它们接受的 MIME 类型Accept而不是在Content-Type标头中,它们可以在标头中指示它们发送给您的数据类型。
于 2016-09-06T20:13:40.743 回答