[PHP] 深度解析Nginx下的PHP框架路由实现
所有的框架處理業(yè)務(wù)請(qǐng)求時(shí),都會(huì)處理URL的路徑部分,分配到指定的代碼中去處理。
實(shí)現(xiàn)這一功能的關(guān)鍵就是獲取$_SERVER全局變量中對(duì)于URL部分的數(shù)據(jù)
當(dāng)請(qǐng)求的路徑為
http://test.com/article?id=1
http://test.com/article/update?id=1
支持以上url模式,不需要配置傳遞PATH_INFO變量,也不需要配置偽靜態(tài)去除index.php
最簡(jiǎn)單的nginx配置如下:
?
此配置有幾個(gè)重點(diǎn)要關(guān)注:
1.try_files必須配置在location塊中,這個(gè)可以用于除去index.php,如果不配置,則必須在路徑中加上/index.php/
2.location ~ \.php
a. 這里是否以$結(jié)尾,有時(shí)會(huì)被困擾,重點(diǎn)看清是否存在try_files,如果不存在try_files指令,那么就一定不要以$結(jié)尾,這樣在路徑中使用帶/index.php/的模式還是可以訪(fǎng)問(wèn)的
b. 如果存在try_files指令,并且location ~ \.php$ 這里是以$結(jié)尾,那么/index.php/在php的location中就匹配不到,但是try_files又把參數(shù)重寫(xiě)到index.php?q=中了,因此這樣也是可以訪(fǎng)問(wèn)到
此時(shí)$_SERVER變量中,經(jīng)常被各大框架或者自寫(xiě)程序用作路由處理使用的變量值如下:
$_SERVER["PHP_SELF"]=>"/index.php",沒(méi)有URL中的參數(shù)
$_SERVER["PATH_INFO"]=>,根本不存在,因?yàn)镹ginx沒(méi)有傳遞這個(gè)變量
$_SERVER["REQUEST_URI"]=>"/article/update?id=1",這個(gè)是實(shí)現(xiàn)路由的關(guān)鍵,參數(shù)都存在
PHP中比較兼容的處理是:
$uri=$_SERVER['REQUEST_URI'];
$uri=str_replace("/index.php","",$uri);
if(strpos($uri,"?")!==false){
$uri=substr($uri,0,strpos($uri,'?'));
}
$uri=trim($uri,'/');
var_dump($uri);//獲取到 article/update
轉(zhuǎn)載于:https://www.cnblogs.com/taoshihan/p/11441214.html
總結(jié)
以上是生活随笔為你收集整理的[PHP] 深度解析Nginx下的PHP框架路由实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 主席树之初见
- 下一篇: CentOS7 系统基于Vim8搭建Go