0

我的引导glyphicons显示在其他浏览器,但我得到谷歌浏览器这个错误:请求的资源上是否存在“Access-Control-Allow-Origin”头?

从原点“http://d37p52igaahgm9.cloudfront.net”字体已 加载由跨来源资源共享政策阻止:无 “访问 - “Control-Allow-Origin”标题出现在请求的 资源中。原因'http://www.anthonygalli.com'因此不允许 允许访问。

的错误仍然存​​在,尽管尝试:

application_controller.rb

before_action :set_cors 

def set_cors 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Request-Method'] = '*' 
end 

application.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' => '*' 
} 

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> 

参考文献

回答

1

您不需要(不应该)在每个响应中生成标头。

在你的情况下,我打赌你的浏览器的资产请求正在使用OPTIONS请求进行“预检”,但CDN通过请求而没有访问控制请求标头。因此,CDN(正确)不会从Rails应用程序接收到CORS响应标头,因此浏览器甚至不会尝试GET请求,并且会因Cross-Origin错误而失败。

“预检”请求首先被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。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-cors

如果你做出改变你的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 
1

尝试增加方法和头在应用控制器。它为我工作。

def cors_set_access_control_headers 
     headers['Access-Control-Allow-Origin'] = '*' 
     headers['Access-Control-Allow-Methods'] = 'POST, PUT, DELETE, GET, PATCH, OPTIONS' 
     headers['Access-Control-Request-Method'] = '*' 
     headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization' 
    end 
相关问题