Rack-cors在swagger-ui_rails的制作环境中没有显示标题
我目前正在运行几个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
我有点茫然,任何帮助或想法,将不胜感激。
,我使用看跌期权,我已经创建成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"