Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用机架中间件返回特定URL的404_Ruby On Rails_Heroku_Rack - Fatal编程技术网

Ruby on rails 如何使用机架中间件返回特定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

我管理的一个站点不断收到来自该站点旧版本的对不再存在的javascript文件的请求。这些请求占用大量资源,因为它们每次都通过Rails路由以返回404。我认为最好让Rack处理特定的URL并返回404本身。对吗?如果是,我将如何设置

我一直在查看这篇博客文章,我认为这是向前发展的一种方式(即从一些现有机架模块继承):


机架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。