3

我对同源策略有疑问。我想提出跨域请求 - 我找到了很好的解决方案:http ://www.w3.org/TR/cors/

但我不想在 Apache 中设置标头,因为我有很多域并且只有一个需要它。是否可以通过虚拟主机或乘客添加Access-Control-Allow-Origin标头?

我这样做是因为我需要在 Chrome/Mozilla 插件中使用 Redmine REST API (XHR)。

4

1 回答 1

0

我有类似的要求。如果您希望 Redmine 提供这些标头,那么您需要修改 Redmine 源。我写了一篇关于这样做的博客文章

大部分细节都归功于这篇博文。

为了方便起见,我将在这里重现我必须做的事情:


首先让我们解决预检检查。为此,我添加了一个全新的控制器,位于/app/controllers/cors_controller.rb. 看起来像:

class CorsController < ApplicationController

    skip_before_filter :session_expiration, :user_setup, :check_if_login_required, :set_localization

    def preflight
            headers['Access-Control-Allow-Origin'] = '*'
            headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT'
            headers['Access-Control-Allow-Headers'] = 'X-Requested-With, X-Prototype-Version, Content-Type'
            headers['Access-Control-Max-Age'] = '1728000'
            render :text => '', :content_type => 'text/plain'
    end

end

很简单的东西。然后,我将所有OPTIONS请求路由到该控制器/config/routes.rb

match '*path', :to => 'cors#preflight', :constraints => {:method => 'OPTIONS'}

进行了预检检查,这只是按照Tom 的建议使用after_filterin将标头添加到主响应的一种情况:/app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  include Redmine::I18n
  # ...
  before_filter :session_expiration, :user_setup, :check_if_login_required, :set_localization

  #************ Begin Added Code ****************
  after_filter :cors_set_access_control_headers

  # For all responses in this application, return the CORS access control headers.

  def cors_set_access_control_headers
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT'
    headers['Access-Control-Max-Age'] = "1728000"
  end
  #************* End Added Code *****************
  #...
end
于 2013-01-13T10:49:25.377 回答