我管理的一个站点不断收到来自旧版本站点的对不再存在的 javascript 文件的请求。这些请求占用了大量资源,因为它们每次都通过 Rails 路由以返回 404。我认为让 Rack 处理该特定 URL 并返回 404 本身会更好。那是对的吗?如果是这样,我将如何设置它?
我一直在查看这篇博文,我认为这是一种前进的方式(即,从一些现有的 Rack 模块继承):
我管理的一个站点不断收到来自旧版本站点的对不再存在的 javascript 文件的请求。这些请求占用了大量资源,因为它们每次都通过 Rails 路由以返回 404。我认为让 Rack 处理该特定 URL 并返回 404 本身会更好。那是对的吗?如果是这样,我将如何设置它?
我一直在查看这篇博文,我认为这是一种前进的方式(即,从一些现有的 Rack 模块继承):
所以我最终编写了自己的一点中间件:
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']
这是我第一次这样做,所以如果有任何明显的错误,请告诉我......
rack-contrib
gem 包含一个Rack::NotFound
中间件组件(以及许多其他有用的元素),它应该可以完成这项工作: