XHR不起作用,因为“Access-Control-Allow-Origin”不允许“Origin”

时间:2010-10-30 01:24:51

标签: jquery apache ruby-on-rails-3 xmlhttprequest http-method

我正在开发一个带有Rails 3的API服务器到目前为止非常方便但是我一直在运行错误而且我不确定它是否因为我的Apache安装程序或Rails应用程序

当我尝试通过XHR在http://sample.domain/uri/id上执行HTTP DELETE或PUT请求时,curl或HTTP -Client.app Rails或Apache响应404或403(取决于客户端。我认为因为cors)并且Safari开发人员控制台以

响应
XMLHttpRequest cannot load http://sample.domain/uri/id. Origin http://web.client/ is not allowed by Access-Control-Allow-Origin.

我在Apache2上使用mod_rack aka mod_rails,我的vhost实际上包含这个:

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods POST,GET,DELETE,PUT,OPTIONS
Header set Access-Control-Allow-Headers X-Requested-With

Apache error_log响应以下错误:

[Sat Oct 30 01:37:34 2010] [error] [client 22.222.222.22] client denied by server configuration: /path/to/rails/folder/public, referer: http://web.client/

Rails development.log以

响应
Started OPTIONS "/uri/id" for 84.190.123.140 at 2010-10-30 03:18:42 +0200
ActionController::RoutingError (No route matches "/uri/id"):

在这里我也不确定为什么OPTIONS调用会降低,因为我认为这只是预检,并且肯定没有OPTIONS的路由,因为我想响应DELETE

如果您对如何解决此问题有任何疑问,请与我分享。

非常感谢大卫

3 个答案:

答案 0 :(得分:1)

在* nix系统中,首先需要包含/启用" Headers" apache中的模块

sudo a2enmod标题

然后,您需要在您的vhost中包含以下行:

标题设置Access-Control-Allow-Origin:" *"

答案 1 :(得分:0)

这听起来像是一个不同的问题。

你正在为CORS的标题做正确的事情。 Apache配置中的其他内容正在拒绝客户端。 Apache根本不关心同源策略,因此您的“服务器配置拒绝客户端”错误将是由于Access指令不正确或类似的原因。

根据建议,请确保您可以先curl -X OPTIONS http://sample.domain/uri/id

答案 2 :(得分:0)

您需要响应OPTIONS方法。在实际的DELETE方法之前发送以确定是否允许发送DELETE命令 - 称为preflighting。您可以使用Access-Control-Max-Age标头控制权限的有效期。

您对OPTIONS的回复是您发送Access-Control-Allow-Origin等的地方

想象一下,如果不是这样的话。您已经删除了该对象后,您将发送ACAO 。可能会或可能不会允许。

对于源服务器,通常最好创建一个可以发布/删除的服务器的实际白名单,或者鹦鹉指回请求服务器的域名。 “*”基本上禁用CORS并使用户能够进行各种攻击。