Ruby on rails 使用机架cors解决机架空间CDN问题

Ruby on rails 使用机架cors解决机架空间CDN问题,ruby-on-rails,cors,rack,font-awesome,rackspace,Ruby On Rails,Cors,Rack,Font Awesome,Rackspace,我有一个rails 4.2应用程序使用。即使我所有的其他资产都很好,我的字体图标也不会显示出来。我正在使用机架空间cdn。我的CDN url看起来像 http://ddf908e003b5678bc25-9d6bfcdc12345678ba868a15bca98.r12.cf5.rackcdn.com/assets/main-4f3595479ce96112e1b8ab4e5357fc26.css 我的机架cors配置位于Myconfig/application.rb config.middl

我有一个rails 4.2应用程序使用。即使我所有的其他资产都很好,我的字体图标也不会显示出来。我正在使用机架空间cdn。我的CDN url看起来像

http://ddf908e003b5678bc25-9d6bfcdc12345678ba868a15bca98.r12.cf5.rackcdn.com/assets/main-4f3595479ce96112e1b8ab4e5357fc26.css
我的机架cors配置位于My
config/application.rb

config.middleware.insert_before 0, "Rack::Cors" do
  allow do
    origins 'localhost:3000', /^http:\/\/\w+.+rackcdn.com/
    resource '/assets/*', headers: :any, methods: :get
  end
end
图标在本地显示得很好。只有在生产中,他们才不会出现。有没有关于我可能遗漏什么的想法

编辑

我在用宝石。当我查看页面时,我没有得到任何javascript错误或任何东西,只有CORS警告,没有图标

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://ddf908e003b5678bc25-9d6bfcdc12345678ba868a15bca98.r12.cf5.rackcdn.com/assets/main-4f3595479ce96112e1b8ab4e5357fc26.css/assets/font-awesome/fontawesome-webfont-e9c0e802c2b0faf4d660e2bff17b5cf1.woff. This can be fixed by moving the resource to the same domain or enabling CORS.
编辑2

我使用帮助设置Ash Wilson建议的自定义标题

AssetSync.configure do |config|
  config.fog_provider = 'Rackspace'
  config.rackspace_username = ENV['RACKSPACE_USERNAME']
  config.rackspace_api_key = ENV['RACKSPACE_API_KEY']
  config.fog_directory = ENV['FOG_DIRECTORY']
  config.fog_region = ENV['FOG_REGION']
  config.gzip_compression = true
  config.manifest = true
  config.custom_headers = {
    "\.(ttf|otf|eot|woff|svg)$" => {
      "Access-Control-Allow-Origin" => "*",
      "Access-Control-Request-Method" => "*",
      "Access-Control-Allow-Methods" => "*"
    }
  }
end
我还没有在我的终端上做任何缓存,但我肯定会清除任何浏览器缓存。我还发现了控制面板中的两个文件
.woff
.ttf
,正如Ash在下面提到的,我手动将标题添加到其中。然而,我仍然看到同样的问题。也许还有一个额外的步骤,或者AssetSync已经死了,不能工作了

编辑3

以下是卷曲的标题。看起来CORS头在里面。等待了一整天的繁殖,但仍然没有去

curl -i -s -XHEAD http://ddf908e003b5678bc25-9d6bfcdc12345678ba868a15bca98.r12.cf5.rackcdn.com/assets/font-awesome/fontawesome-webfont-e0e0f28a0197446b28f818aa81b80530.ttf

HTTP/1.1 200 OK
Content-Length: 112160
Last-Modified: Thu, 07 May 2015 16:49:12 GMT
Accept-Ranges: bytes
Access-Control-Request-Method: *
ETag: c4668ed2440df82d3fd2f8be9d31d07d
X-Timestamp: 1431017351.82062
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, HEAD, OPTIONS
Content-Type: application/font-sfnt
X-Trans-Id: tx53b90a9b638141c6874e6-00554bf992iad3
Cache-Control: public, max-age=259200
Expires: Sun, 10 May 2015 23:47:30 GMT
Date: Thu, 07 May 2015 23:47:30 GMT
Connection: keep-alive

要使CORS正常工作,您需要在Rackspace端的Cloud Files对象上设置CORS头,而不是应用程序提供的头。您可以通过单击每个文件旁边的齿轮图标从中执行此操作:

包含一节,介绍支持的CORS标头以及每个标头的含义

如果您有大量资产,或者有一个自动发布它们的构建过程,那么您将希望使用API或SDK来设置这些资产。包含一个代码段,您可以采用该代码段来执行此操作;将“访问控制允许源”或其他相关标题替换为“内容类型”

下面是一个使用Ruby SDK的完整示例,Fog:

require 'fog'

# Authenticate
@client = Fog::Storage.new(
  :provider => 'rackspace',
  :rackspace_username => '{username}',
  :rackspace_api_key => '{apiKey}',
  :rackspace_region => '{region}'
)

# Find the file object
@directory = @client.directories.get("{container name}")
@file = @directory.get("{file name}")

# To only allow CORS requests from a page hosted at 'my-domain.com'
# You can also set this to '*' to allow CORS requests from anywhere
@file.access_control_allow_origin = "http://my-domain.com"
@file.save

您是否检查了JavaScript控制台以查看您的资源是否已通过?可能有错误消息。另外,font awesome需要提供您的字体文件,所以请确保您是通过CDN提供的,而不仅仅是CSS和JavaScript。我没有收到任何错误,只是CORS警告。我已经更新了我的问题,添加了一些附加信息。这可能不是标题的问题。它可能与机架空间标题有关。您可以在URL上使用“curl-v”来打印标题吗?如果Rackspace CDN没有设置正确的CORS头,我不知道如何解决这个问题。我非常感谢您提供的详细答案。不幸的是,我仍然有同样的问题。我没有缓存任何东西,但清除了所有浏览器缓存以防万一。在控制面板中手动设置标题以进行测试。我正在使用AssetSync。我将更新我的问题以显示最新的更改。我不认为您需要像对待内容更改那样等待头部更改传播到CDN,但我可能弄错了。您可以尝试使用一个新的容器(“目录”)吗?另一种检查标题的方法是将curl与公共http或https URL一起使用:curl-i-s-X HEADhttp://...I 我也这么想。我让它坐了一整天,但仍然没有。我用卷曲的结果更新了我的问题。哦,它出现了!我想我只是太不耐烦了,没有等足够长的时间!谢谢