ThinkPHP中跨域請(qǐng)求設(shè)置的幾種方式
在 ThinkPHP 中支持跨域請(qǐng)求,通常有以下幾種方式:
通過(guò)設(shè)置 HTTP 頭信息
在控制器方法中設(shè)置在需要支持跨域的控制器方法中,設(shè)置允許跨域的 HTTP 頭信息??梢允褂?code>header()函數(shù)來(lái)設(shè)置,例如:
public function yourMethod() { // 設(shè)置允許所有來(lái)源的請(qǐng)求 header('Access-Control-Allow-Origin: *'); // 設(shè)置允許的請(qǐng)求方法 header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); // 設(shè)置允許的請(qǐng)求頭 header('Access-Control-Allow-Headers: Content-Type, Authorization'); // 其他業(yè)務(wù)邏輯代碼 return json(['message' => '跨域請(qǐng)求成功']); }
使用中間件設(shè)置創(chuàng)建一個(gè)中間件來(lái)統(tǒng)一設(shè)置跨域頭信息。例如,使用 ThinkPHP 的命令行工具生成中間件:
收起
bash
php think make:middleware CorsMiddleware
然后在生成的CorsMiddleware
類中,在handle
方法中設(shè)置跨域頭:
<?php namespace app\middleware; class CorsMiddleware { public function handle($request, \Closure $next) { // 設(shè)置允許所有來(lái)源的請(qǐng)求 header('Access-Control-Allow-Origin: *'); // 設(shè)置允許的請(qǐng)求方法 header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); // 設(shè)置允許的請(qǐng)求頭 header('Access-Control-Allow-Headers: Content-Type, Authorization'); if ($request->method() === 'OPTIONS') { // 對(duì)于預(yù)檢請(qǐng)求,直接返回200狀態(tài)碼 return response('', 200); } return $next($request); } }
最后,在app/middleware.php
文件中注冊(cè)中間件:
return [ // 其他中間件... app\middleware\CorsMiddleware::class, ];
使用跨域資源共享(CORS)擴(kuò)展
可以使用一些第三方的 CORS 擴(kuò)展來(lái)簡(jiǎn)化跨域設(shè)置。例如,
fruitcake/laravel-cors
擴(kuò)展,雖然它是為 Laravel 設(shè)計(jì)的,但也可以在 ThinkPHP 項(xiàng)目中使用。首先,通過(guò) Composer 安裝擴(kuò)展:
composer require fruitcake/laravel-cors
然后,在項(xiàng)目中進(jìn)行配置。在
config
目錄下創(chuàng)建一個(gè)cors.php
配置文件,內(nèi)容如下:
<?php return [ 'paths' => ['api/*'], 'allowed_methods' => ['*'], 'allowed_origins' => ['*'], 'allowed_origins_patterns' => [], 'allowed_headers' => ['*'], 'exposed_headers' => [], 'max_age' => 0, 'supports_credentials' => false, ];
最后,創(chuàng)建一個(gè)中間件來(lái)應(yīng)用 CORS 配置。例如:
<?php namespace app\middleware; use Fruitcake\Cors\HandleCors; class CorsMiddleware { protected $cors; public function __construct(HandleCors $cors) { $this->cors = $cors; } public function handle($request, \Closure $next) { return $this->cors->handle($request, $next); } }
同樣,需要在app/middleware.php
文件中注冊(cè)這個(gè)中間件。
使用代理服務(wù)器
Nginx 代理可以在 Nginx 服務(wù)器上設(shè)置代理來(lái)解決跨域問(wèn)題。假設(shè)你的 ThinkPHP 應(yīng)用運(yùn)行在
http://backend.example.com
,而前端應(yīng)用在http://frontend.example.com
。在 Nginx 配置文件中添加如下配置:
server { listen 80; server_name frontend.example.com; location / { proxy_pass http://backend.example.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
這樣,前端應(yīng)用訪問(wèn)http://frontend.example.com
時(shí),Nginx 會(huì)將請(qǐng)求代理到http://backend.example.com
,從而避免了跨域問(wèn)題。
Apache 代理如果使用 Apache 作為服務(wù)器,可以通過(guò)
mod_proxy
模塊來(lái)設(shè)置代理。在 Apache 配置文件中添加以下內(nèi)容:
ProxyPass / http://backend.example.com/ ProxyPassReverse / http://backend.example.com/
這將把所有請(qǐng)求代理到后端的 ThinkPHP 應(yīng)用,實(shí)現(xiàn)跨域訪問(wèn)。
到此這篇關(guān)于ThinkPHP中跨域請(qǐng)求設(shè)置的幾種方式的文章就介紹到這了,更多相關(guān)ThinkPHP跨域請(qǐng)求設(shè)置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php從memcache讀取數(shù)據(jù)再批量寫入mysql的方法
這篇文章主要介紹了php從memcache讀取數(shù)據(jù)再批量寫入mysql的方法,可利用memcache緩解服務(wù)器讀寫壓力,并實(shí)現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)的寫入操作,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-12-12PHP表單提交表單名稱含有點(diǎn)號(hào)(.)則會(huì)被轉(zhuǎn)化為下劃線(_)
做項(xiàng)目的過(guò)程中發(fā)現(xiàn),表單遞交就是不成功,后來(lái)發(fā)現(xiàn)原來(lái)我給控件的名字不規(guī)范導(dǎo)致,控件遞交到后端之后,發(fā)現(xiàn)所有我控件名字中含有.號(hào)的名字,遞交過(guò)之后都會(huì)被轉(zhuǎn)化成下劃線_2011-12-12CodeIgniter php mvc框架 中國(guó)網(wǎng)站
CodeIgniter 是一個(gè)小巧但功能強(qiáng)大的 PHP 框架,作為一個(gè)簡(jiǎn)單而“優(yōu)雅”的工具包,它可以為 PHP 程序員建立功能完善的 Web 應(yīng)用程序。如果你是一個(gè)使用共享主機(jī),并且為客戶所要求的期限而煩惱的開(kāi)發(fā)人員,如果你已經(jīng)厭倦了那些傻大笨粗的框架2008-05-05