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"