Laravel 跨域功能中介軟體

海島發表於2018-05-19

Response Header

  • Access-Control-Allow-Origin : 指明哪些請求源被允許訪問資源,值可以為 "*","null",或者單個源地址。
  • Access-Control-Allow-Credentials : 指明當請求中省略 creadentials 標識時響應是否暴露。對於預請求來說,它表明實際的請求中可以包含使用者憑證。
  • Access-Control-Expose-Headers : 指明哪些頭資訊可以安全的暴露給 CORS API 規範的 API。
  • Access-Control-Max-Age : 指明預請求可以在預請求快取中存放多久。
  • Access-Control-Allow-Methods : 對於預請求來說,哪些請求方式可以用於實際的請求。
  • Access-Control-Allow-Headers : 對於預請求來說,指明瞭哪些頭資訊可以用於實際的請求中。
  • Origin : 指明預請求或者跨域請求的來源。
  • Access-Control-Request-Method : 對於預請求來說,指明哪些預請求中的請求方式可以被用在實際的請求中。
  • Access-Control-Request-Headers : 指明預請求中的哪些頭資訊可以用於實際的請求中。

Request Header

  • Origin : 表明傳送請求或預請求的來源。
  • Access-Control-Request-Method : 在傳送預請求時帶該請求頭,表明實際的請求將使用的請求方式。
  • Access-Control-Request-Headers : 在傳送預請求時帶有該請求頭,表明實際的請求將攜帶的請求頭。

中介軟體

在 Laravel 中允許跨域請求,我們可以構建一個追加響應的中介軟體,用來新增專門處理跨域的請求的響應頭

<?php namespace App\Http\Middleware;

use Closure;
use Response;
class EnableCrossRequestMiddleware {
  public function handle($request, Closure $next)
  {
    $response = $next($request);
        $response->header('Access-Control-Allow-Origin', '請求域名地址');
        $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept');
        $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, DELETE, OPTIONS');
        $response->header('Access-Control-Allow-Credentials', 'true');
        return $response;
  }
}
複製程式碼

其中有以下需要注意的地方:

  • 對於跨域訪問並需要伴隨認證資訊的請求,需要在 XMLHttpRequest 例項中指定 withCredentials 為 true。
  • 這個中介軟體你可以根據自己的需求進行構建,如果需要在請求中伴隨認證資訊(包含 cookie,session)那麼你就需要指定 Access-Control-Allow-Credentials 為 true, 因為對於預請求來說如果你未指定該響應頭,那麼瀏覽器會直接忽略該響應。
  • 在響應中指定 Access-Control-Allow-Credentials 為 true 時,Access-Control-Allow-Origin 不能指定為 *
  • 後置中介軟體只有在正常響應時才會被追加響應頭,而如果出現異常,這時響應是不會經過中介軟體的。

相關文章