如何在rails下的webrick中设置access-control-allow-origin?

Posted

技术标签:

【中文标题】如何在rails下的webrick中设置access-control-allow-origin?【英文标题】:How to set access-control-allow-origin in webrick under rails? 【发布时间】:2011-02-01 21:20:23 【问题描述】:

我编写了一个小型 Rails 应用程序,通过 xmlhttprequests 向另一个站点提供内容,该应用程序将从另一个域运行(不可能让它们在同一服务器上运行)。我知道我需要在我的 rails 服务器上设置 access-control-allow-origin 以允许请求网页访问此材料。

关于如何使用 Apache 执行此操作的文档似乎相当完备,这可能是我在部署站点后将使用的服务器。虽然我正在开发,但我希望只使用 webrick,就像我习惯使用 rails 一样。有没有办法配置 webrick 以在 rails 中提供适当的 http 标头?

【问题讨论】:

什么是“访问控制允许来源”?为了更好地理解 webrick,我发现这是一个不错的开始:microjet.ath.cx/webrickguide/html/What_is_WEBrick.html 这是一个 http 标头,告诉浏览器如果请求页面来自不同的域,则可以从该服务器访问资源。 【参考方案1】:

Rails 4 (http://edgeguides.rubyonrails.org/security.html#default-headers)

在 config/application.rb 中:

config.action_dispatch.default_headers.merge!(
  'Access-Control-Allow-Origin' => '*',
  'Access-Control-Request-Method' => '*'
)

【讨论】:

+1 请注意,上面的代码还删除了现有的默认标头(X-Frame-Options、X-XSS-Protection、X-Content-Type-Options) @DanielRikowski 因此,如果我们简单地将这些默认标题添加回列表中没有问题,对吧? @Noz:没错。通过将它们添加到哈希中或仅合并上面的附加标头。 更新了不删除现有默认标题的答案 我相信像这样对所有域启用 CORS 会产生一些重大的安全影响。 code.google.com/p/html5security/wiki/CrossOriginRequestSecurity【参考方案2】:

如果您使用的是 Rails 2,只需将其添加到您的应用程序控制器即可。

before_filter :set_access

def set_access
  @response.headers["Access-Control-Allow-Origin"] = "*"
end

显然,将 "*" 更改为不那么开放的东西是个好主意。

【讨论】:

哇,你把这个问题从历史的深处拖了出来。谢谢(不幸的是,我前段时间出于其他原因放弃了该项目,但这很有用) 也许是rails 4?编辑:rails 4 在下面 ;) ***.com/a/17815546/845717 对于 Rails 4(具体操作):response.headers["Access-Control-Allow-Origin"] = "*"【参考方案3】:

Rails 3.1

class ApplicationController < ActionController::Base
  protect_from_forgery
  after_filter :set_access_control_headers

  def set_access_control_headers
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Request-Method'] = '*'
  end
end

【讨论】:

【参考方案4】:

Rails 3.1 - 使用控制器 after_filter 对我不起作用,所以我添加了一个自定义中间件:

在 app/middleware/cors_middleware.rb 中:

# For icons to work in Firefox with CDN
class CorsMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    cors_headers = headers.merge(
      'Access-Control-Allow-Origin' => '*',
      'Access-Control-Request-Method' => '*'        
    )
    [status, cors_headers, body]
  end  
end

在 config/application.rb 中:

require File.join(Rails.root, "app", "middleware", "cors_middleware")
config.middleware.insert_before ActionDispatch::Static, CorsMiddleware # Need it early in the chain to work for assets

【讨论】:

【参考方案5】:

Rails 2.3.8

before_filter :allow_cross_domain_access
def allow_cross_domain_access
  response.headers["Access-Control-Allow-Origin"] = "*"
  response.headers["Access-Control-Allow-Methods"] = "*"
end

【讨论】:

【参考方案6】:

如果您希望将解决方案作为 Rack 中间件 gem: https://github.com/cyu/rack-cors

【讨论】:

【参考方案7】:

接受的答案有一些变化对我有用。展示新答案会比展示新答案更容易

skip_before_action :verify_authenticity_token
before_action :set_access


def set_access
   headers["Access-Control-Allow-Origin"] = "*"
end

【讨论】:

以上是关于如何在rails下的webrick中设置access-control-allow-origin?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中设置 GraphQL Relay API

Rails + Cucumber/Capybara:如何在测试中设置/检索 cookie?

如何使用 restforce gem 在 Rails 中设置 Salesforce 凭据?

如何在 Rails OAuth 请求中设置参数?

在 rails 3 中设置记录器

使用 RSpec 测试 Rails 辅助方法时如何在参数哈希中设置值?