Rails捕获所有路由阻止访问公用文件夹

时间:2013-03-19 15:35:25

标签: ruby-on-rails ruby rails-routing

......这很有道理。我在自定义CMS中使用catch all route进行页面路由。但是我仍然想在我的公共文件夹中访问用户上传的资源。我的路线如下:

match "(*url)" => 'pages#show'

我的控制器执行此操作:

def show
    @page = Page.where(:url => ['/', params[:url]].join).first
     begin
        render :template => "templates/" + @page.template.slug
     rescue
        render "public/404.html"
     end
end

现在我知道我可以在我的控制器中解析url但是我想知道是否有更好的rails方式 - 例如,我可以在catch所有路由中添加一个异常吗?

思想?

2 个答案:

答案 0 :(得分:4)

如果您的服务器配置正确,通常静态文件将优先于Rails生成的内容。

注意不要将相对于应用程序的路径(例如/public/images/test.png)与相对于Web根目录的路径混淆,后者为/images/test.png。这种相互冲突的“路径”定义让很多开发人员感到困惑。

答案 1 :(得分:1)

在Rails 5上,默认生产配置通过环境变量标志启用公共文件服务器。将enabled值直接设置为true或确保设置RAILS_SERVE_STATIC_FILES环境变量。然后将提供公共目录中的文件,而catch catch all route将不会捕获它们。

# config/environments/production.rb
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?