Ruby on rails 如何使用机架中间件返回特定URL的404
我管理的一个站点不断收到来自该站点旧版本的对不再存在的javascript文件的请求。这些请求占用大量资源,因为它们每次都通过Rails路由以返回404。我认为最好让Rack处理特定的URL并返回404本身。对吗?如果是,我将如何设置 我一直在查看这篇博客文章,我认为这是向前发展的一种方式(即从一些现有机架模块继承):Ruby on rails 如何使用机架中间件返回特定URL的404,ruby-on-rails,heroku,rack,Ruby On Rails,Heroku,Rack,我管理的一个站点不断收到来自该站点旧版本的对不再存在的javascript文件的请求。这些请求占用大量资源,因为它们每次都通过Rails路由以返回404。我认为最好让Rack处理特定的URL并返回404本身。对吗?如果是,我将如何设置 我一直在查看这篇博客文章,我认为这是向前发展的一种方式(即从一些现有机架模块继承): 机架contribgem包括一个rack::NotFound中间件组件(以及许多其他有用的元素),该组件应完成以下任务: 因此我最终编写了自己的一点中间件: module Rac
机架contribgem包括一个
rack::NotFound
中间件组件(以及许多其他有用的元素),该组件应完成以下任务:
因此我最终编写了自己的一点中间件:
module Rack
class NotFoundUrls
def initialize(app, exclude)
@app = app
@exclude = exclude
end
def call(env)
status, headers, response = @app.call(env)
req = Rack::Request.new(env)
return [status, headers, response] if !@exclude.include?(URI.unescape(req.fullpath))
content = 'Not Found'
[404, {'Content-Type' => 'text/html', 'Content-Length' => content.size.to_s}, [content]]
end
end
end
然后将其添加到config.ru文件:
use Rack::NotFoundUrls, ['/javascripts/some.old.file.js']
这是我第一次这样做,所以如果有任何明显的错误,请告诉我…这看起来很有希望,但似乎只是定义了一个默认的404端点?我该如何定义对该文件的所有请求也应该进入该文件?如果URL列表很长,您可能希望使用散列或集合进行更高效的查找。哦,更重要的是,您仍然会在每个请求上达到完整的堆栈。您应该让if子句包装整个顶部,这样您就不会调用
@app.call(env)
来获取被排除的URI。