我正在使用 Rails 3 开发一个 API 服务器,到目前为止它非常方便,但我一直遇到错误,我不确定这是因为我的 Apache 设置还是 Rails 应用程序。
当我尝试通过 XHR、curl 或 HTTP-Client.app 在 http://sample.domain/uri/id 上执行 HTTP DELETE 或 PUT 请求时,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 又名 mod_rails,我的虚拟主机实际上包含这个:
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, referrer: http://web.client/
Railsdevelopment.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
如果您对如何解决此问题有任何想法,请与我分享。
非常感谢
在 *nix 系统中,您首先需要在 apache 中包含/启用“Headers”模块
sudo a2enmod 标头
然后,您需要在虚拟主机中包含以下行:
标头设置 Access-Control-Allow-Origin: "*"
您需要响应 OPTIONS 方法。它在实际 DELETE 方法之前发送,以确定是否允许发送 DELETE 命令 - 称为“预检”。您可以使用 Access-Control-Max-Age 标头控制权限的有效时间。 在您对 OPTIONS 的回复中,您可以发送 Access-Control-Allow-Origin 等信息。 想象一下如果情况并非如此。您将在删除对象后
发送 ACAO。这可能被允许也可能不被允许。对于源服务器,通常最好创建一个可以发布/删除的实际服务器白名单,或者鹦鹉学舌返回请求服务器的域名。 “*”本质上会禁用 CORS 并使用户面临各种攻击。
这听起来像是一个不同的问题。
关于 CORS 标头,您的做法是正确的。 Apache 配置中的其他内容正在拒绝客户端。 Apache 根本不关心同源策略,因此您的“客户端被服务器配置拒绝”错误将是由于不正确的
按照建议,请确保您首先可以
curl -X OPTIONS http://sample.domain/uri/id
。