1. 程式人生 > >【html5】在PHP處理js的跨域請求問題:Access-Control-Allow-Origin

【html5】在PHP處理js的跨域請求問題:Access-Control-Allow-Origin

在javascript與伺服器的請求中,例如POST。

前提條件:如果你使用了自定義的headers引數content-type,將會被判定為複雜請求。

這時候,在請求資料之前,客戶端會發出一個型別為options的預檢資料。

用來讓伺服器確認此次的請求是否符合安全要求(跨域許可權)。

如果伺服器返回失敗,則POST請求被攔截,請求失敗!

也就是說,以post跨域請求為例,會發送兩次請求。

第一次請求,為options預檢。(此結果決定第二次請求是否傳送)

第二次請求,為post正常請求。

這時候,我們需要在伺服器上進行設定,允許哪些域名可以通過預檢。

拿PHP伺服器來舉例,只需要在PHP程式碼中進行以下設定即可。

<?php

// 允許來自任何來源的設定方法
if (isset($_SERVER['HTTP_ORIGIN'])) {
    // 必須在 $_SERVER['HTTP_ORIGIN'] 有值
    // 開發時如果你想要允許所有的域名,就這樣做類似於*:
    // 正式部署時,需要改成固定的域名以保證安全
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

// 在OPTIONS請求期間接收訪問控制頭
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        // 也可能正在使用PUT,PATCH,HEAD等,根據需要自已新增
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    exit(0);
}

提示:在正式佈署時,Access-Control-Allow-Origin,引數值最好改為指定的域名許可。

header('Access-Control-Max-Age: 86400');    // cache for 1 day 表示預檢的快取,通過一次多久後重發

這樣就解決了js跨域請求的問題。