【html5】在PHP處理js的跨域請求問題:Access-Control-Allow-Origin
阿新 • • 發佈:2018-12-15
在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跨域請求的問題。