2017-03-03 90 views
7

我在遠程服務器中託管的Laravel 5.1中創建了REST api。現在,我試圖從另一個網站(我在本地)使用該API。對預檢請求的響應沒有通過訪問控制檢查Laravel和Ajax調用

在Laravel中,我設置了發送CORS頭文件所需的行。我還使用郵差測試了API,一切似乎都沒問題!

在前端

然後,在網站上我當時是使用AJAX POST請求,使用此代碼:

var url="http://xxx.xxx.xxx.xxx/apiLocation"; 
var data=$("#my-form").serialize(); 
    $.ajax({ 
        type: "POST", 
        url: url, 
        data: data, 
        headers: { 'token': 'someAPItoken that I need to send'}, 
        success: function(data) { 
         console.log(data); 
        }, 
        dataType: "json", 
       }); 

購買,然後我在控制檯收到此錯誤:

XMLHttpRequest無法加載http://xxx.xxx.xxx.xxx/apiLocation。 對預檢請求的響應未通過訪問控制檢查:否 請求的 資源上存在「訪問控制 - 允許來源」標頭。因此不允許訪問原產地'http://localhost'。

在後端

在我設置的API(使用Laravel中間件設置頭):

return $next($request) 
      ->header('Access-Control-Allow-Origin', '*') 
      ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); 

所以,我感到困惑的地方是完全問題。

  1. 在服務器中?但爲什麼郵差工作正常?
  2. 是否在Ajax調用中?那麼,我應該添加什麼?

回答

4

您的後端代碼必須包含一些明確的處理OPTIONS請求發送一個200響應只有配置的標頭;例如:

if ($request->getMethod() == "OPTIONS") { 
    return Response::make('OK', 200, $headers); 
} 

服務器端的代碼也必須發送一個Access-Control-Allow-Headers響應頭,其中包括token請求的名稱頭的前端代碼發送:

-> header('Access-Control-Allow-Headers', 'token') 

但後來爲什麼用郵差工作正常嗎?

因爲郵差不是一個Web應用程序,並且不受同一來源的政策限制,所以瀏覽器會放在Web應用程序上,以限制它們製作跨源請求。 Postman是一個瀏覽器插件,爲了方便測試請求,他們可以使用curl或命令行中的任何內容在瀏覽器之外製作。郵差可以自由發出跨域請求。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS相比之下,它解釋了瀏覽器如何阻止網絡應用發出跨域請求,以及如何通過配置後端發送正確的CORS頭來解除瀏覽器的阻止。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests解釋了爲什麼瀏覽器正在發送請求您的後端需要處理的OPTIONS

相關問題