如何在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?