我对同源政策有疑问。我想提出跨域请求 - 我找到了很好的解决方案:http://www.w3.org/TR/cors/
但我不希望在Apache中设置标头,因为我有很多域,只有一个需要它。是否可以通过虚拟主机或乘客添加 Access-Control-Allow-Origin 标头?
我这样做,因为我需要在Chrome / Mozilla插件中使用Redmine REST API(XHR)。
答案 0 :(得分:0)
我有类似的要求。如果您希望Redmine提供这些标头,那么您需要修改Redmine源。我写过a blog post about doing this。
大部分细节都归功于this blog post。
为了方便,我将重现我在这里要做的事情:
首先让我们来检查预检检查。我在/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_filter
中的/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