2010-10-30 60 views
3

我正在使用Rails 3的API服務器至今非常方便,但我運行一個錯誤所有時間,我不確定這是因爲我的Apache安裝程序或Rails應用程序。XHR不起作用,因爲「起源是不允許的訪問控制允許起源」

當我嘗試通過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. 

響應我使用mod_rack又名上的Apache2 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 

阿帕奇的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

如果您對如何解決此問題有任何想法,請與我分享。

非常感謝大衛大衛

+0

我不確定我是否完全理解您的問題,但它聽起來有點類似於傳說中的可疑[同源策略](http://en.wikipedia.org/wiki/Same_origin_policy)。 – 2010-10-30 01:27:20

+0

您是否驗證過直選'OPTIONS'?例如,使用'curl -X OPTIONS http:// localhost/uri/id'? – 2010-10-30 01:32:20

+0

我或多或少地確定這是因爲sop,但我認爲我會使用我的標題設置來修復它。我不確定使用OPTIONS,因爲Rails應該只響應DELETE/PUT,因爲我認爲OPTIONS請求只是'預檢' – Phil 2010-10-30 01:41:59

回答

0

您需要響應OPTIONS方法。它在之前發送實際的DELETE方法來確定是否允許發送DELETE命令 - 稱爲preflighting。您可以使用Access-Control-Max-Age標題控制權限的有效期限。

在你的迴應選項是你送的訪問控制允許來源等

試想一下,如果事實並非如此。您將在之後發送ACAO ,您已經刪除了該對象。哪些可能或可能不被允許。

對於原始服務器,通常最好創建一個實際的白名單服務器,可以發佈/刪除或鸚鵡回請求服務器的域名。一個「*」實質上禁用了CORS並且打開了用戶各種各樣的攻擊。

0

這聽起來像一個不同的問題。

你正在做關於CORS標題的正確事情。 Apache配置中的其他內容會拒絕客戶端。 Apache根本不關心同源策略,所以你的「客戶端拒絕服務器配置」錯誤將是由於Access指令或類似的錯誤。

正如所建議的,確保您可以先curl -X OPTIONS http://sample.domain/uri/id

1

在您需要首先包括* nix系統/啓用阿帕奇「頭」模塊

須藤a2enmod頭

然後,你需要在你的虛擬主機,以包括以下行:

標題集訪問控制允許來源:「*」

相關問題