我目前正在運行幾個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
我有點茫然,任何幫助或想法,將不勝感激。