1

我目前正在運行幾個Rails 3.2.x應用程序。使用Ruby 1.9.x並且是api端點的端點上有Rack-cors gem(1.0.1) - app Alice;另一個運行swagger-ui_rails gem,並且是託管api文檔的應用程序 - 應用程序Bob。 swagger文檔是由swagger-docs gem創建的,它運行1.2版的格式。由於某種原因,我無法獲取應用程序Alice向我提供Bob的信息,因爲此錯誤:Rack-cors在swagger-ui_rails的製作環境中沒有顯示標題

Failed to load https://alice.example.com/api-docs/v1/api-docs.json: 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://bob.example.com:3000' is therefore not allowed access. 

但是!當我查看網絡選項卡時,響應是200,我可以看到json信息。但是響應頭文件肯定沒有所需的Access-Control-Allow-Origin頭文件。

這通過AWS Elastic Beanstalk(Bob在EBS上託管)和本地(w /綁定的地址)都會發生。

在我翹config/environments/production.rb,我有以下幾點:

config.middleware.insert_before 0, 'Rack::Cors' do 
    allow do 
    origins ->(origin, env) do 
     Rails.logger.warn("CORS origin: #{origin}") 
     origin =~ /\.example\.com(:\d+)?\z/ 
    end 
    resource('*', :methods => [:get, :post, :options], :headers => :any) 
    end 
end 

當我有這樣的代碼在config/environments/development.rb愛麗絲,本地主機連接和招搖的用戶界面顯示爲與控制檯沒有錯誤的預期。

在Chrome中的網絡選項卡,這是我在本地(Alice和Bob的開發/本地主機)

Access-Control-Allow-Methods:GET, POST, OPTIONS 
Access-Control-Allow-Origin:http://apitest.bob.com:3000 
Access-Control-Expose-Headers: 
Access-Control-Max-Age:1728000 
Content-Length:1499 
Content-Type:application/json 
Date:Fri, 22 Sep 2017 21:44:45 GMT 
Last-Modified:Mon, 28 Aug 2017 17:37:22 GMT 
Server: 
Vary:Origin 

這是我得到的時候鮑勃在開發和Alice是PROD:

Accept-Ranges:bytes 
Connection:keep-alive 
Content-Length:1500 
Content-Type:application/json 
Date:Fri, 22 Sep 2017 23:10:00 GMT 
ETag:"abc-559ce64fb8374" 
Last-Modified:Fri, 22 Sep 2017 22:04:35 GMT 
Server: 

正如你所看到的,督促翹不返回任何排序標題的DEV-愛麗絲的方式做,即使使用完全相同的機架-CORS代碼塊。

rake middleware在堆棧頂部顯示Rack :: Cors,並且curl -i https://alice.example.com/api-docs/v1/api-docs.json從未在本地和Bob的服務器上爲我返回適當的訪問控制標題。

prod-Bob還有一些EBS擴展可以向nginx添加一些請求頭和方法。在其他一些SO帖子中,我看到人們直接通過Rails添加響應頭文件,因此Bob在application_controller.rb中也有以下內容(並且在dev中,使用binding.pry,我可以確認響應肯定具有指定的頭文件)

after_filter :set_access_control_headers 

    def set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = Rails.configuration.hostnames['headers'] 
    headers['Access-Control-Request-Methods'] = 'GET, PUT, POST, OPTIONS' 
    end 

我有點茫然,任何幫助或想法,將不勝感激。

回答

1

,我使用看跌期權,我已經創建成Rails的/public目錄中的文件.json招搖-docs的寶石。因此,Rails認爲這是靜態文件,而不是應該通過Rack中間件的東西。由於我們的production.rb文件有config.serve_static_assets = false,這意味着所有這些靜態文件都是我們的Web服務器(Apache/Nginx)的責任,而不是rack-cors gem的責任。

將一些CORS頭文件添加到Apache之後,swagger-ui正確加載,但將頭文件加倍 - 第一個用於Apache,第二個用於機架。

因爲我已經刪除機架CORS寶石和已經調整Apache服務器的conf翹上設置的基礎上,採用SO解答有關通配符子域:

的/ etc/apache2的/啓用的站點 -/mysite的。conf

SetEnvIf Origin ^(https?://.+\.example\.com(?::\d{1,5})?)$ CORS_ALLOW_ORIGIN=$1 
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN}e env=CORS_ALLOW_ORIGIN 
Header merge Vary "Origin" 
Header set "Access-Control-Allow-Methods" "GET, POST, OPTIONS"