对于机架应用程序,如何使乘客独立服务器提供.erb文件的输出而不是自己发送.erb文件?

时间:2015-10-07 17:04:36

标签: ruby nginx passenger erb rack

我有一个简单的 config.ru 机架应用,我只需要并运行 rack-server-pages 来提供动态网页快捷方便。此 config.ru 应用由phusion passenger-standalone (内部使用nginx)提供。

.erb 文件的处理和提供正确,除非我明确地将.erb扩展名添加到URL(对于.erb文件)。在那种情况下服务器会将.erb文件发送给我,而不是输出。显然我想避免这种情况。


为了更清楚:


服务器上的文件名为 somefile.erb

这有效:

www.domain.com/somefile

这会发送.erb文件以供下载☹:

www.domain.com/somefile.erb


我该如何解决这个问题?这是我应该在应用程序级别管理的问题(rack-server-pages),还是在Web服务器级别(nginx配置)?在这两种情况下我都需要一些帮助......

更新2:我认为this rack-server-pages file could be relevant ......但这只是一个疯狂的猜测,我不知道该改变什么......

更新1:粘贴乘客独立的Nginx配置文件。 Passenger-standalone在内部使用Nginx,但使用不同的设置而不是/etc/nginx/nginx.conf的系统范围的Nginx。根据{{​​1}}处的文件,在每个乘客独立运行时重新生成乘客独立Nginx的默认设置。以下是该文件:

/usr/share/passenger/templates/standalone/config.erb

1 个答案:

答案 0 :(得分:0)

您的ERB页面是否在名为public的目录中?

当Passenger处理请求时,Nginx将首先尝试在public目录中找到匹配的文件,如果它找到一个将直接提供它而不将请求传递给您的应用程序,因为许多Web应用程序框架使用此默认情况下静态文件的目录(例如Rails,Sinatra)。

由于Rack Server Pages也defaults to public for its templates,我怀疑这是你的情况。当您使用扩展时,Passenger能够找到匹配的文件并将其作为响应直接发回。如果没有扩展,Passenger会将请求传递给应用程序,该应用程序可以映射到文件并按预期处理。

由于看起来Rack Server Pages也使用views作为默认模板目录,因此最简单的解决方案可能是创建一个具有此名称的目录并将模板移入其中。如果您有任何静态文件,可以将它们保留在public中,并获得Nginx的速度优势。

如果您愿意,可以更改view_path配置选项并完全使用其他目录。

如果您想更改乘客方面的配置,可以查看static_files_dir option。您可能必须确保在这种情况下您选择的目录确实存在,即使它是空的。