CORS问题:获取错误“No’Access-Control-Allow-Origin’标题存在”实际存在时
我怀疑为我的应用程序提供服务的后端非常重要,但是如果你关心,我会使用带有Rails 4.0应用程序的机架 。
使用jQuery,我向我的应用程序发送一个PATCH
请求,如下所示:
$.ajax({ url: "http://example.com/whatever", type: "PATCH", data: { something: "something else" } })
当我从Chrome触发此调用时,我看到一个成功的OPTIONS
请求输出,它从我的服务器返回这些标头:
Access-Control-Allow-Credentials:true Access-Control-Allow-Headers:accept, content-type Access-Control-Allow-Methods:GET, PUT, PATCH, OPTIONS Access-Control-Allow-Origin: http://sending-app.localhost:3000 Access-Control-Expose-Headers: Access-Control-Max-Age:15
然后我看到一个PATCH
请求出去,这引发了这个错误:
XMLHttpRequest无法加载http://example.com/whatever 。 请求的资源上不存在“Access-Control-Allow-Origin”标头。 因此不允许Origin’http://sending-app.localhost:3000 ‘访问。
我尝试从PATCH
切换到PUT
,结果相同。
这对我没有任何意义。 这是怎么回事?
更新:我的config / application.rb
我认为标题告诉了整个故事,但由于人们感到困惑,这是我的config/application.rb
文件,这是Rails的rack-cors插件的配置方式:
config.middleware.use Rack::Cors do allow do origins '*' resource '*', :headers => :any, :methods => [:get, :put, :patch, :options], :max_age => 15 end end
在操作中排除Rails CSRF检查;)
也就是说,Rails使用更新/创建请求检查真实性令牌。 在您的Rails应用程序中,此令牌将添加到您的所有表单中。 但是对于javascript请求,包括它是棘手的。
您可以通过将其添加到控制器来跳过检查操作:
skip_before_filter :verify_authenticity_token, :only => [:update]
顺便说一句,您的问题与CORS无关,您在浏览器中收到错误的错误消息。 Rails日志讲述了真实的故事。
您可能希望将此添加到config/application.rb
文件中:
#config/application.rb config.middleware.use Rack::Cors do allow do origins '*' resource '/*', :headers => :any, :methods => :patch end end
resource
部分是您定义端点可以接受的方法/请求的位置!
希望这可以帮助
这是一些奇怪的东西。
A)作为试验,您应该尝试输入*
作为您允许的来源。
B)这是一个空白问题吗? 在冒号之后,您在某些选项中没有空格。
C)这看起来像是一个“预检请求”( https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS )。 预检请求是不使用“application / x-www-form-urlencoded”的请求,您应该使用该请求。 http://api.jquery.com/jquery.ajax/声明默认内容类型是x-www-form-urlencoded,并且您没有覆盖内容类型。 这意味着不应该有2个请求。
D)如上所述,CSRF可能是个问题。 我不是铁路人。 如果是问题,您可能想要做的是将CSRF令牌附加到所有ajax发送,如下所示:
$.ajaxSetup({ beforeSend:function(xhr, settings){ xhr.setRequestHeader('X-CSRF-Token', '<%= csrf_token_value %>'); } });
还有其他一些方法可以做到这一点。 这取决于您的框架/库需要什么。
以下是我发现的解决旧SOpost处理csrf问题的问题:
# In application_controller.rb protect_from_forgery after_filter :set_csrf_cookie def set_csrf_cookie cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery? end protected # In Rails 4.2 and above def verified_request? super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN']) end
- jQuery,CORS,JSON(没有填充)和身份validation问题
- JQuery CORS和重定向
- 使用jQuery的Jenns json REST api和CORS请求
- IE8 / IE9中的跨源头
- 是否有可能使application / json的跨域POST ajax请求?
- Jquery AJAX:请求的资源上没有“Access-Control-Allow-Origin”标头
- 以jsonp发送请求,使用jQuery 1.5将响应解释为文本
- CORS + Cordova:问题:Access-Control-Allow-Origin
- CORS问题 – 请求的资源上没有“Access-Control-Allow-Origin”标头