【问题标题】:How can I prevent the asset pipeline from conflicting with my /.../.../.../images URL?如何防止资产管道与我的 /.../.../.../images URL 冲突?
【发布时间】:2012-11-27 00:20:32
【问题描述】:
我有一个由 Rails 提供的 REST API,它有一个路径 /api/blah/blah/images.json,它提供有关图像的信息,它是图像模型的一个实例。在开发中,这很好用;在我们创建的沙盒环境中,这会导致 apache 错误(路径永远不会与 routes.rb 匹配,并且 rails 日志根本没有记录请求)。
我们进行了测试,发现这个问题恰好出现在那些包含子字符串“/images”、“/javascripts”或“/stylesheets”的 URL 上,因此我们怀疑 rails 资产管道以某种方式拦截了这些 URL(然后在该路径上找不到任何图像,并给出错误)。
如何配置哪些 URL 被视为资产,哪些根据 routes.rb 传递给控制器?
【问题讨论】:
标签:
ruby-on-rails
url-rewriting
asset-pipeline
【解决方案1】:
解决了。我们的 {environment}.include apache conf 文件中有以下几行:
# Turn passenger off for directories w/ just static content and
# allow auto indexing.
<Location ~ /(stylesheets|javascripts|images|snapshots|fonts)>
PassengerEnabled off
FileETag None
# Options -Indexes
</Location>
只要 url 路径与正则表达式 /\/(stylesheets|javascripts|images|snapshots|fonts)/ 匹配,就会关闭乘客(因此阻止 Rails 收到请求)。这是一个非常过分热心的正则表达式 - 在我们的例子中,它应该只在路径以这些名称之一开头时才匹配,所以我们将其更改为
# Turn passenger off for directories w/ just static content and
# allow auto indexing.
<Location ~ ^/(stylesheets|javascripts|images|snapshots|fonts)/>
PassengerEnabled off
FileETag None
# Options -Indexes
</Location>
这样它只会在该单词实际上是路径中的第一件事时匹配。