【问题标题】:Rails Custom Header for Images用于图像的 Rails 自定义标题
【发布时间】:2012-11-27 01:23:37
【问题描述】:

当有人请求图像时,是否可以在 Rails 3 中修改 HEADER?例如:

http://localhost:3000/assets/myimg.png

我想将 Access-Control-Allow-Origin: "*" 添加到标题中,以便我可以通过 JavaScript 远程下载图像文件。

更新 1

我有资源文件夹下的图像更改标题的答案,但现在我还需要为公共图像做同样的事情。我尝试了以下相同的方法,但没有运气。

示例网址是

http://localhost:3000/images/stuff.png

我尝试了 Rack MiddleWare,但它在访问公共映像时不运行 call 方法。我还尝试了 LocationMatch(在生产环境中),同样没有运气。

我应该如何尝试让公共图像结束更改标题?

更新 2

所以,我确实设法通过 LocationMatch 让它工作,但图像无法缓存。有没有办法通过 apache 禁用图像缓存?

【问题讨论】:

  • 您将在哪里托管您的应用程序?如何实现这一点取决于您的生产环境,即您的静态文件服务器。
  • 生产将通过 Apache 完成,开发是 WEBRICK。
  • 在开发模式下,由于文件是通过 ActionDispatch::Static(而不是 Apache)提供的,因此很难获得任何标头(通过合理的代码更改)。我不知道以 Ryan 描述的方式在 Apache 中更改配置有多么困难,但是您需要复制您的生产设置以获取您的标头(当 Apache 提供文件时)或者只是在您的生产环境。

标签: ruby-on-rails ruby-on-rails-3 image http-headers


【解决方案1】:

资产将被“编译”并直接由 Web 服务器(Nginx/Apache)提供服务,因此 Rails 不会在生产环境中提供服务。您需要修改 Web 服务器的配置以添加标头。

Apache 中的类似内容。

<LocationMatch "^/assets/.*$">
  Header add Access-Control-Allow-Origin "*"
  ...
</LocationMatch>

这在 Nginx 中。

location ~ ^/assets/ {
  add_header Access-Control-Allow-Origin *;
  ...
}

有关预编译资产的更多详细信息,请参阅this guide

更新:如果您需要在开发环境中应用标头,您可以使用一些自定义机架中间件来实现。示例见this gist

【讨论】:

  • 很棒,涵盖了生产方面。谢谢!如何在开发模式下修改 WEBRICK,以便我可以通过 Javascript 在 Phonegap 中测试缓存图像。现在它一直告诉我不允许原产地......直到我修复开发方面。
  • 或者我必须停止使用 WEBRICK 并开始使用其他允许更改标题的开发系统吗?
  • 这是个好问题。我不知道如何配置 Sprockets 在为资产管道提供服务时使用的标头。可能有一种方法,但您也可以在 config/environments/development.rb 中使用自定义机架中间件。它可以修改为资产请求发回的标头。
  • 顺便说一句,对于好奇的,Sprockets::Server 模块是处理资产响应的。我看不到在那里配置标头的方法:github.com/sstephenson/sprockets/blob/master/lib/sprockets/…
  • 感谢@ryanb 的帮助!
猜你喜欢
  • 2016-04-02
  • 2011-01-06
  • 2013-01-09
  • 1970-01-01
  • 2015-03-07
  • 2023-02-04
  • 2013-04-14
  • 2019-03-23
  • 2014-12-26
相关资源
最近更新 更多