2013-03-09 30 views
0

我的restler 3 api可以在本地測試服務器上正常工作,並且可以在生產服務器上正常工作,如果來自同一服務器的調用,但是如果我遠程調用則失敗。restler 3跨域不起作用

使用與luracast網上的例子同樣的REST客戶端正常工作與遠程調用,這樣一定是東西在我的配置(無論是我的API或我的生產服務器)。

我發現需要提送頭等等嘗試添加這些標頭index.php文件:

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE'); 
header('Access-Control-Max-Age: 1000'); 
header('Access-Control-Allow-Headers: *'); 

但是這並沒有幫助。在firefox中使用RESTClient插件,我可以看到發送了這些頭文件,並且瀏覽器將在本地和遠程顯示數據,無論是否使用這些頭文件命令。

下面是一個示例調用: https://api.masterpiecesolutions.org/v1/artists/?key=A4oxMOYEUSF9lwyeFuleug==

我該呼叫的index.php使用此,與第二個參數去映射到根級

$r->addAPIClass('Artists', ''); 

不知道這是否是相關的。

此外,生產服務器是亞馬遜EC2,所以可能與安全策略有關?

或者,也許這是一些其他的頭問題?在谷歌瀏覽器中,使用高級Rest Rest Client擴展,它給出的狀態爲403 ForbiddenContent-Typetext/plain(無論是使用本地還是遠程服務器),因此根本不起作用,與firefox插件不同。

我也看到使用的Restler.php $_SERVER['HTTP_ORIGIN'],這似乎並沒有到處被支持?

回答

1

至少對我來說,問題在於使用SSL,而restclient類沒有適應這個問題。因此,我添加了(從phpclasses.org到我的RestClient.class.php)。 curl_setopt //對於SSL ,現在它工作。

還需要設置 public static $ crossOriginResourceSharing = true; 在Defaults.php Restler 3.

+0

僅供參考:如果您在內部使用curl,則根本不需要CORS支持。只有在瀏覽器跨域請求中才需要CORS – Luracast 2013-03-14 13:37:11

1

*不是用於Access-Control-Allow-Headers響應報頭中的有效的值。您需要列出每個非簡單的請求標頭。例如:

header('Access-Control-Allow-Headers: Content-Type'); 

也可以考慮把單一的原值或只是*Access-Control-Allow-Origin頭。我剛剛訪問了您的示例網址,並且該頭部中有多個值。雖然這應該按照CORS規範工作,但它尚未被廣泛採用。

最後我注意到服務器設置爲Access-Control-Allow-Credentials: true。如果你將其設置爲true,那麼你還需要做其他兩兩件事:

  1. Access-Control-Allow-Origin頭的值必須是原產地的價值(例如http://localhost,它不能是*)。
  2. 您需要在您的JavaScript客戶端代碼中設置xhr.withCredentials = true;

如果你只是測試,你應該嘗試的東西,而不設置Access-Control-Allow-Credentials頭工作。它會讓事情更容易調試。

+0

謝謝,我設置Access-Control-Allow-Credentials爲false並且Access-Control-Allow-Origin爲*,但仍然沒有運氣。 我註釋掉了Restler.php中的代碼,它們設置了這些頭文件並在API的index.php文件中手動設置它們。 似乎我必須缺少Restler或服務器配置中的某些內容,因爲我的測試休息客戶端可以很好地對遠程調用Luracast服務器上的Restler 3示例。 – twiddly 2013-03-11 12:45:50