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 
相關問題