Ant*_*com 5 google-chrome ruby-on-rails amazon-s3 cors amazon-cloudfront
我的引导字形显示在其他浏览器上,但我在 google chrome 上收到此错误:
来自源“ http://d37p52igaahgm9.cloudfront.net ”的字体已被跨源资源共享策略阻止加载:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问来源“ http://www.anthonygalli.com ”。
尽管尝试了以下方法,错误仍然存在:
应用程序控制器.rb
before_action :set_cors
def set_cors
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Request-Method'] = '*'
end
Run Code Online (Sandbox Code Playgroud)
应用程序.rb
config.middleware.insert_before 0, "Rack::Cors" do
allow do
origins '*'
resource '*', :headers => :any, :methods => [:get, :post, :options]
end
end
config.action_dispatch.default_headers = {
'Access-Control-Allow-Origin' => '*',
'Access-Control-Request-Method' => '*'
}
Run Code Online (Sandbox Code Playgroud)
CORS 配置编辑器
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://www.anthonygalli.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Content-*</AllowedHeader>
<AllowedHeader>Host</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>https://anthonygalli.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Content-*</AllowedHeader>
<AllowedHeader>Host</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)
参考
您不需要(不应该)在每个响应中生成标头。
就您而言,我敢打赌来自您浏览器的资产请求正在使用 OPTIONS 请求进行“预检”,但 CDN 会在没有 Access-Control 请求标头的情况下传递请求。因此,CDN(正确地)没有从 Rails 应用程序接收到 CORS 响应标头,因此浏览器甚至不会尝试 GET 请求,并且会因跨源错误而失败。
“预检”请求首先通过 OPTIONS 方法向其他域上的资源发送 HTTP 请求,以确定实际请求是否可以安全发送
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests
您的 CDN 需要设置为将正确的请求标头转发到您的应用程序服务器,以便它知道生成 CORS 标头。然后,CDN 会将这些 CORS 响应标头传递给浏览器。
当您希望缓存 OPTIONS 响应时,请配置 CloudFront 以转发以下标头:Origin、Access-Control-Request-Headers 和 Access-Control-Request-Method。
如果您对 CDN 的这些标头进行更改,然后使您的资产无效,则您的rack-cors配置本身应该可以正常工作。
# config/initializers/cors.rb
# @note: must be run after initializers/_assets.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
# All asset requests should be to rails prefixed assets paths
# serverd from the asset pipeline (e.g.: "/assets/*" by default)
resource "#{Rails.application.config.assets.prefix}/*",
# Allow any request headers to be sent in the asset request
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Headers
headers: :any,
# All asset fetches should be via GET
# Support OPTIONS for pre-flight requests
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests
methods: [:get, :options]
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16236 次 |
| 最近记录: |