今天在react中使用axios請求自己用TP5寫的接口時出現(xiàn)了以下錯誤
感謝這位博主的文章解決了問題,一下內(nèi)容轉自該文章
https://www.ruoxiaozh.com/blog/article/59,如有侵權岗宣,聯(lián)系馬上刪除汽馋。
首先要弄懂
什么是 CORS
CORS(Cross-Origin Resource Sharing 跨源資源共享)记罚,當一個請求 url 的協(xié)議均函、域名、端口三者之間任意一與當前頁面地址不同即為跨域合住。跨域點:
當瀏覽器檢查到有跨域的問題周崭,會對訪問的接口做一個判斷,如果是簡單的接口扛点,則直接訪問哥遮,如果是復雜的接口岂丘,則需要先發(fā)送一個 option 請求,如果路由里面沒有定義該接口的 option 請求眠饮,就會報一個 404 錯誤奥帘。解決方法
其實大多數(shù)跨域問題,只要在訪問的接口中寫入下面的一段話就可以解決:
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
header('Access-Control-Allow-Methods: GET,POST');
一般瀏覽器在檢查到跨域問題時仪召,會有兩次請求寨蹋,第一次是 option,如果放回 200返咱,然后才會正式去訪問接口钥庇。所以需要在有跨域的地方,都加上一個對 option 請求的處理咖摹,但是如果項目的接口太多评姨,在每個接口都加這樣一個判斷,顯然有點費時費力萤晴,此時吐句,AOP 思想便可以很好的解決這個問題。下面我們已 thinkPHP5 框架為例店读。
thinkPHP5 對 AOP 有較好的支持嗦枢,所謂的 AOP 就是面向切面編程的思想。
在 thinkPHP 的 application 目錄下屯断,有一個 tags.php 文件文虏,這個能保證加載全局的函數(shù)。
將 CORS 跨域處理文件的路徑定義到 app_init 下殖演,這就能保證氧秘,tp5 框架在初始化就加載這個跨域處理函數(shù)。
在 application->tags.php 文件中添加如下代碼:
// 應用初始化
'app_init' => [
'app\\api\\behavior\\CORS'
],
新建文件 application->api->behavior->CORS.php
<?php
namespace app\api\behavior;
use think\Response;
class CORS
{
public function appInit(&$params)
{
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: token,Origin, X-Requested-With, Content-Type, Accept");
header('Access-Control-Allow-Methods: POST,GET');
if (request()->isOptions()) {
exit();
}
}
}
這樣就解決了 thinkPHP5 跨域的問題趴久。