掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯網交流
thinkphp6開啟多應用模式(在thinkphp5對應的是多模塊),假設我們設置home應用為前臺模塊,admin為后臺模塊,api為api接口模塊,common為公共數據處理模塊。那么網站前臺的訪問路徑可能是這樣的:
http://www.althqafhm.com/home/project/view/id/21.html
可以通過路由規(guī)則重寫,如這樣的代碼
Route::get('/item/:id', 'home/project/view');
這樣上面開頭的鏈接會變成:
http://www.althqafhm.com/item/21.html
實際上作為用戶前臺都帶上一個并沒有多少意義的home/,自然會影響url的美觀度。雖然可以通過重寫路由規(guī)則來一個個方法來重寫,但是這個下面這個路徑:
http://www.althqafhm.com/home/index/index.html
即便通過路由規(guī)則重寫,如這樣的代碼:
Route::get('/', 'home/index/index');
生成的地址是這樣的:
http://www.althqafhm.com/home/
而且路由規(guī)則重新我們需要針對一個個方法分別重新,那么有沒有什么辦法不管是什么路徑都可以統(tǒng)一完成重寫呢?也就是在默認路由生成的url中去掉應用的名稱(如home)呢?
答案當然是有的!當然,thinkphp6的設計理念就已經不再是面向后臺和前端融合在一起的傳統(tǒng)開發(fā)方式,而是針對前后端分離開發(fā)而設計的,比如最典型的就是已經把session給禁用了,而是用一種類似cache的方式來模擬實現session。但是,實際上thinkphp6用來做非前后端分離的應用也是可以的。首先說明的是,這篇文章雖然是針對最新的tinkphp6,但對于thinkphp5也具有參考意義。
方法一:應用綁定域名
通過config/app.php來配置多域名,設置domain_bind,如這樣設置:
// 域名綁定(自動多應用模式有效) 'domain_bind'=> [ 'www'=>'home', 'sys'=>'admin', 'api'=>'api' ],
這樣訪問www這個子域名就可以訪問home應用,而且url中會自動去掉home。這種方式也是框架設計就預留的一種方式,配置過程是相對簡單的,但前提是這個站點必須同時綁定多個域名(如果有多個可通過url訪問的應用)。那么如果只能綁定一個域名,而且同時要滿足多應用呢是否可以呢?答案是可以的,但前提是admin和api應用的url中不需要刪除對應的應用名稱,否則某些路徑可能跟home應用混淆了,下面兩種方法就是實現的兩種方式。
方法二:前臺應用直接使用app根目錄的應用
也就是控制器目錄直接是app\controller,而其他的應用則分別是app\應用名(如admin)\controller,這種雖然看上去有點不倫不類,但這樣確實就不存在對應的應用名稱的。但是,如果需要在其他應用中生成前臺應用的url就會出現異常,比如在后臺文章列表中需要生成一個文章前臺訪問的網址。這時候假設url寫法是這樣的:
url('posts/view',['id'=>1])
我們預期要生成的url是
posts/view/id/1.html
但實際上thinkphp會自動認為這個url是后臺這個應用的路由,于是就變成了
admin/posts/view/id/1.html
那怎么辦呢?還是有辦法的,那就是在后臺生成前臺應用的url的時候,不使用thinkphp自帶的url助手方法,自己重寫一個方法,如home_url。
function home_url($path,$vars=[]){ $string=url(strtolower($path),$vars,true,false)->build(); $defalutModule = 'home'; $search = '/'.$defalutModule.'/'; $pos = stripos($string, $search); if($pos !== false && substr_count(rtrim($string,'/'), '/') >= 2) { $string = substr($string, 0, $pos).'/'.substr($string, $pos + strlen($search)); } return $string; }
然后在后臺生成前臺url的時候,使用home_url代替url,且在路徑上加上home。
url('home/posts/view',['id'=>1])
這樣就可以生成我們所預期的url。
方法三:在入口文件指定應用
依然創(chuàng)建home應用作為網站前臺,前臺的url生成不使用url,而采用類似方法二中的home_url來重新url生成規(guī)則。但只是生成不帶home的url,這樣方法肯定會報錯,因為這樣默認肯定會方法app\controller下的控制器了。那么如何使用不含home的url直接訪問到app\home\controller呢。那就是在入口文件(默認位于public\index.php),修改如下代碼:
$response = $http->run();
修改為:
$response = $http->name('home')->run();
但是這樣一來home應用是可以正常訪問,但admin、api等其他應用訪問肯定是異常的,這時候需要給admin、api等其他應用創(chuàng)建自己的入口文件,比如admin,可以復制index.php代碼(把其中的home改為admin)另存為admin.php,其他應用一樣的道理。但這樣admin、api的路徑都需要修改,如果是新項目還好,如果是已經寫好的項目那么就有點麻煩了。其實,如果不需要刪除admin、api等應用的url中的應用名稱,其實可以在入口文件中這么寫:
$path=isset($_SERVER['QUERY_STRING'])?$_SERVER['QUERY_STRING']:''; if(stripos($path,'admin')==1 || stripos($path,'api')==1){ $response = $http->run(); }else{ $response = $http->name('home')->run(); }
這段代碼的意思是,如果訪問的路徑是admin或api開頭的,則需要url指定應用名稱;而home應用則無需指定應用名,英文在入口文件中就已經指定了。
方法四:最粗暴的方法,在web服務器軟件重寫url
首先借鑒方法二中的home_url方法,把home應用的url生成為不帶home的url,直接訪問肯定是不行的??梢酝ㄟ^web服務器軟件(如apache或nginx)進行規(guī)則重寫,也就是我們通常所說的服務器偽靜態(tài)規(guī)則,實現訪問不帶home的url自動指向到app\home\controller下的方法。
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯網交流