【问题标题】:ActionDispatch::Static in Rails production environmentRails 生产环境中的 ActionDispatch::Static
【发布时间】:2026-02-01 10:05:01
【问题描述】:

我希望使用ActionDispatch::Static 来提供非公共目录中的静态文件。它在开发中完美运行,但我似乎无法在生产中获得相同的结果。

我在/var/www/mysite.com-static 中有我的静态文件。在初始化程序中,我添加了以下内容:

Rails.application.config.middleware.insert_after Rack::SendFile, ActionDispatch::Static, '/var/www/mysite.com-static'

rake middleware的输出如下:

use Raven::Rack
use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000005e61130>
use Rack::Runtime
...

为什么我在 /var/www/myapp.com-static 中请求的每个页面都会收到 404?

【问题讨论】:

  • 如果 nginx 服务于您的静态资产,那么您为什么要尝试借助 rails 应用程序来处理它?
  • nginx 在 /var/www/myapp.com/public 中为我的静态资产提供服务。我还想在 /var/www/myapp.com-static 中提供静态资产。据我所知,nginx 只允许你指定一个根目录(不使用位置)。

标签: ruby-on-rails actiondispatch


【解决方案1】:

我最终解决了这个问题,在我的 Rails 应用程序的config.ru 中添加了中间件。

require ::File.expand_path('../config/environment',  __FILE__)

# Added the following line
use ActionDispatch::Static, '/var/www/myapp.com-static'

run Rails.application

这很有效,因为我在初始化程序中设置了 ActionDispatch::Static 的路径,该初始化程序是在中间件安装后加载的。如果我正确配置了加载顺序,Rails.application.config.middleware 也会起作用。

【讨论】:

  • 这很奇怪。虽然两者之间存在一些差异,但不确定为什么在不同的地方添加 ActionDispatch::Static 会有所不同。
  • 是的,我也这么认为。最奇怪的部分是使用 config.middleware.use 在开发和测试中工作正常,但在生产中拒绝工作。
  • 这个在开发而不是生产中工作的明显原因是如果 NGinX 试图从错误的地方提供文件并且不能。因此,由于您提供的是静态文件,所以这并不奇怪 as :-)
  • 您能详细说明一下吗?我不确定你的意思。
  • 如果 NGinX 识别出目录,尝试从静态目录提供文件,并在您的应用有机会尝试之前提供 404,则明显的失败模式是。
最近更新 更多