什么是PATHINFO:就是http://localhost/index.php/Home/Index/index/a/1/b/2?c=3中的紅色部分,
注意c=3並不是pathinfo的一部分,它是一個query參數。
pathinfo值得是URL的路徑實際上不存在的時候,apache或者Nginx等通過一定的手段將不存在的路徑,都是實際
不存在路徑保存到環境變量$_SERVER['PATH_INFO']中。也可以將它轉化為$_GET['s']參數,TP也可以識別。
也就是說當你訪問TP項目的時候,你實際上訪問的只是入口文件index.php,不管你后面有多長的路徑,都是實際不存在的,
轉換成PATHINFO或$_GET['s']了而已。
那么THINKPHP就是根據PATHINFO,從中提取出 分組名,模塊名 ,方法名 , 以及將剩余的部分轉換成為$_GET
變量,比如TP從PATHINFO字符串中提取'Home'字段串,將其保持到
$_GET['g'] , $_GET['m']='Index' ;$_GET['a']='index' ;$_GET['b']=2.可以dump('$_GET')看看。
關於URL詳細的解析流程,請看 ThinkPHP/Lib/Core/Dispatcher.class.php 核心類。
URL路由:
URL路由--Url Router,指的是,在TP進行常規url解析之前,先檢測路由,如果發現有路由規則匹配當前的PATHINFO,那么URL解析則交給路由處理。
路由規則是由多條 rule=>router 規則組成的數組。(規則 =>路由器)
路由處理過程大概如下: 1.遍歷路由規則rule,與當前PATHINFO字符串進行匹配,如果合法,則從PATHINFO中取出所需要的字符串。 2.路由中每條規則對應一個router,router中指定對應的模塊以及方法,模塊和方法可以用第1步中匹配到的字符串進行動態替代。 3.將剩余的參數都解析並寫入到$_GET中。
-------------------------------------------------------------------------------------------------------------------------------------
url的4種訪問方式 (這是重點!!)
1.PATHINFO 模式 --重點 在后面使用非常多,如果想傳多個參數可以使用鍵1/值1/鍵2/值2方法
代碼如下: http://域名/項目名/入口文件/模塊名/方法名/鍵1/值1/鍵2/值2
2.普通模式也稱為重寫模式
代碼如下: http://域名/項目名/入口文件?m=模塊名&a=方法名&鍵1=值1&鍵2=值2
3.REWRITE重寫模式,去掉入口文件便於SEO優化
代碼如下: http://域名/項目名/模塊名/方法名/鍵1/值1/鍵2/值2
4.兼容模式
代碼如下: http://域名/項目名/入口文件?s=模塊名/方法名/鍵1/值1/鍵2/值2
如何修改PATHINFO地址中的/改成-在Home/Conf/config.php中
代碼如下: 'URL_PATHINFO_DEPR'=>'-',//修改RUL的分隔符,把地址欄的參數部分/換成:http://域名/項目名/入口文件/模塊名-方法名-鍵1-值1-鍵2-值2
在index.php中開啟調用模式,為了在后產模式中不讓文件緩存影響開發
代碼如下: define('APP_DEBUG',ture);//如果設置為ture不緩存文件,false則緩存文件
REWRITE模式開啟方法
在httpd.conf中查找rewrite_module modules/mod_rewrite.sl 把#去掉重啟服務,在入口文件下新建.htaccess.php,重寫文件是去掉index.php的意思:
代碼如下: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
路由處理過程大概如下:
1.遍歷路由規則rule,與當前PATHINFO字符串進行匹配,如果合法,則從PATHINFO中取出所需要的字符串。 2.路由中每條規則對應一個router,router中指定對應的模塊以及方法,模塊和方法可以用第1步中匹配到的字符串進行動態替代。 3.將剩余的參數都解析並寫入到$_GET中。