- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在运行几个 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 的信息:
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 信息。但是响应 header 肯定没有所需的 Access-Control-Allow-Origin
header 。
这通过 AWS Elastic Beanstalk(Bob 托管在 EBS 上)和本地(带有绑定(bind)地址)发生。
在我的 Alice 的 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
当我在 Alice 的 config/environments/development.rb
中有此代码时,localhost 连接并且 swagger-ui 按预期显示,控制台中没有错误。
在 Chrome 的网络选项卡中,这是我本地的(Bob 和 Alice 在 dev/localhost 中)
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
这就是当 Bob 在开发中而 Alice 在生产中时我得到的:
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:
如您所见,prod-Alice 不会像 dev-Alice 那样返回任何类型的 header ,即使使用完全相同的 Rack-Cors 代码块也是如此。
rake middleware
在堆栈的顶部显示 Rack::Cors,并且 curl -i https://alice.example.com/api-docs/v1/api-docs .json
从未在本地和 Bob 的服务器上为我返回正确的访问控制 header 。
prod-Bob 也有一些 EBS 扩展,用于向 nginx 添加一些请求 header 和方法。在其他一些 SO 帖子中,我看到人们直接通过 Rails 添加响应 header ,因此 Bob 在 application_controller.rb
中也有以下内容(在开发中,通过 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
我有点不知所措,如有任何帮助或想法,我们将不胜感激。
最佳答案
我正在使用的 Swagger-docs gem 将我创建的 .json
文件放入 Rails 的 /public
目录中。因此,Rails 将其视为静态文件,而不是应该通过 Rack 中间件的文件。由于我们的 production.rb 文件有 config.serve_static_assets = false
,这意味着所有这些静态文件都是我们的网络服务器 (Apache/Nginx) 的责任,而不是 rack-cors gem 的责任。
将一些 CORS header 添加到 Apache 后,swagger-ui 会适当加载,但会加倍 header - 第一个用于 Apache,第二个用于 rack-cors。
我已经删除了 rack-cors gem 并根据与通配符子域相关的 SO 答案调整了 Alice 上的 Apache 服务器 conf 设置:
/etc/apache2/sites-enabled/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"
关于ruby-on-rails - Rack-cors 未在 swagger-ui_rails 的生产环境中显示 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46374445/
我正在做一些中间件,在它到达 Rails 之前更改 authenticity_token 参数。 我可以看到 env.inspect 给出了 rack.request.form_vars 和 rack
我在带有 gem rack 1.3.2 和 1.2.1 的 debian 上安装了 passenger 3.0.9。 使用带有 passenger e bundler 的 rails 3.0 应用程序
我熟悉 Rails.root在 Rails 中,它会告诉您当前应用程序的目录。这有时非常方便。 现在我正在开发一个 Rack 应用程序(Rails 基于它)。我如何找到 Rails.root相当于 R
这个问题在这里已经有了答案: You have already activated X, but your Gemfile requires Y (12 个答案) 关闭 8 年前。 我有一个在 Dr
我想根据响应主体的大小有条件地启用 Rack::Deflater,如下所示: use Rack::Deflater, :if => lambda { |*, body| body.map(&:byte
我写了一段 Rack Middleware 来自动解压缩压缩的请求体。代码似乎工作正常,但是当我将它插入我的 Rails 应用程序时,我从 ActionController::ParamsParser
我想我在我的头上,无法弄清楚如何调试或从这里去哪里?!任何指导将不胜感激! 问题: 开发环境:一切正常 生产:我收到“请求超时”错误 目标: 让“www.site.com/blog”显示来自“blog
我有一个 Middleman我正在使用 Rack::TryStatic 服务的应用程序。 这是config.ru。 use Rack::TryStatic, root: 'build', ur
很抱歉,如果这个问题与另一个问题重复,但我还没有找到它。 我有一些 Grape API(它们是 Rack 应用程序),其中之一(用户 API)使用中间件进行身份验证。 在我的 config.ru 文件
如何在单个 Rack 应用程序中与多个 session cookie(针对不同的路径或域)进行交互? 例如,考虑以下使用 3 个位置的应用程序: www.my-app.net => 主应用 www.m
我目前有以下内容: use Rack::Rewrite use Rack::Cache, {:verbose=>true, :metastore=>"memcached://localhost:112
我有一个应用程序,它有一个包含静态文件的 htdocs 文件夹和位于 httpd/cgi-bin 文件夹中的几个 CGI 脚本。我如何使用带有 config.ru 的 Rack 来为这个应用程序提供服
给定一个非 Rails 的 Rack 应用程序, 构建器.rb: def app Rack::Builder.new{ use Rack::Static, urls:static_path
我试图完全理解 Rack 中并发请求处理的选项。我已经使用 async_sinatra 构建了一个长轮询应用程序,现在正在使用 throw :async 和/或 Thin 的 --threaded 标
我在使用 rSpec 的 Controller API 进行测试时遇到了很大的麻烦。现在我正在使用中间件身份验证解决方案 ( Warden ),当我运行规范时,中间件添加的代理不存在,所有身份验证测试
这是一个常见问题,但似乎没有一个答案能解决问题。我得到了通常的:You have already activated rack 1.4.1, but your Gemfile requires rac
当运行 rspec 以使用 Sinatra Base 测试功能测试时,我们收到以下错误。 这就是我们的功能测试的样子 require 'capybara/rspec' feature 'Ent
从 Selenium 切换到 PhantomJs/Poltergeist 时,我一直收到此错误。有人知道我做错了什么吗?如果我将驱动程序切换到 selenium,脚本将完美运行。每当我注释掉 defa
Rack::Session::Pool 有哪些不同的用例?和 Rack::Session::Cookie ? 据我了解(如果我错了请纠正我): Cookie 将 所有 session 键值对直接存储在
我正在处理 oauth 1.0(twitter 和 flickr)。网站工作在80端口,oauth服务器工作在8080端口 算法: 向oauth服务器发送ajax请求以检查用户是否有有效的access
我是一名优秀的程序员,十分优秀!